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, полученный из первого запись.

Полная трата времени!!!!

Другие вопросы по тегам