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