Удалите атрибут C# свойства динамично

У меня есть класс с рядом свойств As, данных ниже.

class ContactInfo
{
    [ReadOnly(true)]
    [Category("Contact Info")]
    public string Mobile { get; set; }

    [Category("Contact Info")]
    public string Name{ get; set; }
}

Объекты этого класса присваиваются сетке свойства, так, чтобы пользователи могли обновить существующий контакт. Вы видите, что Мобильный отмечен как ReadOnly.

Но, когда я хочу добавить совершенно новый Контакт, я хотел бы, чтобы пользователи смогли отредактировать контакт, Мобильный также. Для этого я должен удалить свойство Readonly динамично из Типа, прежде, чем присвоить объект сетке свойства. Действительно ли это возможно?

11
задан Mike Two 20 March 2010 в 14:20
поделиться

4 ответа

Вы не можете удалить атрибут во время выполнения, но вы можете использовать отражение, чтобы изменить закрытое резервное поле ReadOnly атрибута ReadOnly на False. Сделать его эквивалентом [ReadOnly (false)]

Подробнее см. В этой статье:

http://codinglight.blogspot.com/2008/10/changing-attribute-parameters-at.html

Изменить : fixed link

8
ответ дан 3 December 2019 в 09:40
поделиться

Я последовал предложению Легендена. Вот что я придумал

class ContactInfo
{
        [ReadOnly(true)]
        [Category("Contact Info")]
        public string Mobile { get; set; }

        [Category("Contact Info")]
        public string Name{ get; set; }

        public void SetMobileEdit(bool allowEdit)
        {
             PropertyDescriptor descriptor =  TypeDescriptor.GetProperties(this.GetType())["Mobile"];

             ReadOnlyAttribute attrib = (ReadOnlyAttribute)descriptor.Attributes[typeof(ReadOnlyAttribute)];

             FieldInfo isReadOnly = attrib.GetType().GetField("isReadOnly", BindingFlags.NonPublic | BindingFlags.Instance);

             isReadOnly.SetValue(attrib, !allowEdit);
        }
}
0
ответ дан 3 December 2019 в 09:40
поделиться

Я должен согласиться с Ому; в данном случае вы действительно говорите о двух классах (моделях представления) для поддержки двух разных представлений.Что-то вроде

CreateContactViewModel и EditContactViewModel

2
ответ дан 3 December 2019 в 09:40
поделиться

в настоящий момент невозможно удалить атрибуты динамически (во время выполнения)

, в качестве предложения вы можете сделать 2 класса: один с атрибутами и один без

1
ответ дан 3 December 2019 в 09:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: