ReadOnlyAttribute vs PropertyDescriptor.IsReadOnly()
В чем разница между использованием PropertyDescriptor
который возвращает значение для IsReadOnly()
метод, и тот, который связан с ReadOnlyAttribute
?
3 ответа
Основное отличие состоит в том, что это позволяет вам получить больше контроля, если вы предоставите свой собственный PropertyDescriptor
реализация (через ICustomTypeDescriptor
, TypeDescriptionProvider
или же TypeConverter
). Затем вы можете выбрать свою собственную логику, когда она будет доступна для записи - например, на основе прав доступа.
Но да; при реализации по умолчанию он будет сообщать только для чтения о свойствах без установщиков и о свойствах, отмеченных значком ReadOnlyAttribute
,
Нет разницы, когда я смотрю на это с помощью Reflector.
Один из производных классов SimplePropertyDescriptor имеет следующий код.
public override bool IsReadOnly
{
get
{
return this.Attributes.Contains(ReadOnlyAttribute.Yes);
}
}
Просто примечание.
Я потратил день на реализацию ICustomTypeDescriptor для объектов сущностей в моем приложении, чтобы контролировать состояние только для чтения каждой сущности в отдельности.
Таким образом, каждая реализация PropertyDescriptor сохраняла ссылку на объект сущности, из которого она вышла, поэтому свойство IsReadOnly было примерно таким:
public override bool IsReadOnly
{
get { return _owner.IsReadOnly;}
}
Однако, когда я запустил код, компонент BindingSource прочитал набор PropertyDescriptor из метода GetProperties() ICustomTypeDescriptor для каждой записи в наборе, однако, когда он проверял значение IsReadOnly, он проверял только PropertyDescriptor, полученный из первого запись.
Полная трата времени!!!!