Как во время выполнения проверить, является ли свойство доступным только для чтения? - PullRequest
7 голосов
/ 09 марта 2011

Я автоматически генерирую код, который создает диалоговое окно winform на основе конфигурации (текстовые поля, dateTimePickers и т. Д.).Элементы управления в этих диалоговых окнах заполняются из сохраненного набора данных, и

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

//Upon opening of form - populate control properties with saved values
MyObject.Value = DataSource.GetValue("Value");

//Upon closing of form, save values of control properties to dataset.
DataSource.SetValue("Value") = MyObject.Value;

Теперь все в порядке, но что со свойствами readOnly?Я хочу сохранить результат свойства, но мне нужно знать, когда НЕ нужно генерировать код, который попытается его заполнить.

//Open form, attempt to populate control properties.
//Code that will result in 'cannot be assigned to -- it is read only'
MyObject.HasValue = DataSource.GetValue("HasValue");
MyObject.DerivedValue = DataSource.GetValue("Total_SC2_1v1_Wins");

//Closing of form, save values. 
DataSource.SetValue("HasValue") = MyObject.HasValue;

Помните, что я не знаю тип объекта, который создаю, до момента выполнения,

Как (во время выполнения) определить свойство только для чтения?

Ответы [ 3 ]

7 голосов
/ 09 марта 2011

С PropertyDescriptor, проверьте IsReadOnly.

С PropertyInfo, проверьте CanWriteCanRead, в этом отношении).

Вы также можете проверить [ReadOnly(true)] в случае PropertyInfo (но это уже обрабатывается с PropertyDescriptor):

 ReadOnlyAttribute attrib = Attribute.GetCustomAttribute(prop,
       typeof(ReadOnlyAttribute)) as ReadOnlyAttribute;
 bool ro = !prop.CanWrite || (attrib != null && attrib.IsReadOnly);

IMO, PropertyDescriptor являетсялучшая модель для использования здесь;это позволит пользовательские модели.

3 голосов
/ 08 марта 2016

Я заметил, что при использовании PropertyInfo свойство CanWrite имеет значение true, даже если установщик является частным. Эта простая проверка работала для меня:

bool IsReadOnly = prop.SetMethod == null || !prop.SetMethod.IsPublic;
2 голосов
/ 20 марта 2012

Также - См. Страницу Microsoft

using System.ComponentModel;

// Get the attributes for the property.

AttributeCollection attributes = 
   TypeDescriptor.GetProperties(this)["MyProperty"].Attributes;

// Check to see whether the value of the ReadOnlyAttribute is Yes.
if(attributes[typeof(ReadOnlyAttribute)].Equals(ReadOnlyAttribute.Yes)) {
   // Insert code here.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...