У меня есть класс с рядом свойств As, данных ниже.
class ContactInfo
{
[ReadOnly(true)]
[Category("Contact Info")]
public string Mobile { get; set; }
[Category("Contact Info")]
public string Name{ get; set; }
}
Объекты этого класса присваиваются сетке свойства, так, чтобы пользователи могли обновить существующий контакт. Вы видите, что Мобильный отмечен как ReadOnly.
Но, когда я хочу добавить совершенно новый Контакт, я хотел бы, чтобы пользователи смогли отредактировать контакт, Мобильный также. Для этого я должен удалить свойство Readonly динамично из Типа, прежде, чем присвоить объект сетке свойства. Действительно ли это возможно?
Вы не можете удалить атрибут во время выполнения, но вы можете использовать отражение, чтобы изменить закрытое резервное поле ReadOnly атрибута ReadOnly на False. Сделать его эквивалентом [ReadOnly (false)]
Подробнее см. В этой статье:
http://codinglight.blogspot.com/2008/10/changing-attribute-parameters-at.html
Изменить : fixed link
Я последовал предложению Легендена. Вот что я придумал
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);
}
}
Я должен согласиться с Ому; в данном случае вы действительно говорите о двух классах (моделях представления) для поддержки двух разных представлений.Что-то вроде
CreateContactViewModel и EditContactViewModel
в настоящий момент невозможно удалить атрибуты динамически (во время выполнения)
, в качестве предложения вы можете сделать 2 класса: один с атрибутами и один без