Динамическое удаление атрибута C # свойства - PullRequest
9 голосов
/ 20 марта 2010

У меня есть класс с набором свойств, как указано ниже.

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

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

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

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

Ответы [ 5 ]

7 голосов
/ 20 марта 2010

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

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

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

Редактировать: фиксированная ссылка

2 голосов
/ 20 марта 2010

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

CreateContactViewModel и EditContactViewModel

1 голос
/ 20 марта 2010

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

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

0 голосов
/ 07 ноября 2010

Блог CodingLight.com перенесен в blogspot (ссылка выше не работает). Смотри http://codinglight.blogspot.com/2008/10/changing-attribute-parameters-at.html.

Кроме того, в продолжении SysAdmin не упоминается атрибут [RefreshProperties(RefreshProperties.All)], который необходим для реально работающего решения.

Наконец, я считаю, что даже Дэвид Мортон (автор цитируемой статьи) упустил одну очень важную вещь: если класс (ContactInfo, в следующем примере SysAdmin) не имеет хотя бы одного свойства с атрибутом [ReadOnly], определенным во время компиляции, а затем, когда для свойства «isReadOnly» FieldInfo установлено значение true во время выполнения, в результате весь класс становится доступным только для чтения.

0 голосов
/ 20 марта 2010

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

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);
        }
}
...