2011-03-09 15 views
6

Soy un código de generación automática que crea un diálogo de winform basado en la configuración (cuadros de texto, dateTimePickers, etc.). Los controles en estos cuadros de diálogo se completan desde un conjunto de datos guardado yEn tiempo de ejecución, ¿cómo puedo probar si una propiedad es de solo lectura?

necesita establecer y obtener propiedades para varios objetos de control (personalizados u otros).

//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; 

Ahora todo está bien, pero ¿qué ocurre con las propiedades readOnly? Deseo guardar el resultado de la propiedad pero necesito saber cuándo NO generar código que intentará llenarlo.

//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; 

Recuerda que no sé el tipo de objeto que he instanciado hasta el tiempo de ejecución.

¿Cómo puedo (en tiempo de ejecución) identificar una propiedad de solo lectura?

+0

En mi opinión, los usuarios no pueden modificar una propiedad desde su formulario de UI si es de solo lectura. Parece que actualmente todas las propiedades se pueden editar en el formulario, y las puedes verificar mientras guardas? –

+0

Verdad en su extracto, pero este es un código generado automáticamente. El error está en tiempo de compilación. La única vez que obtendría un "no se puede asignar a" será cuando el código generado rellene las propiedades del control de lo que se guardó, por lo que accidentalmente se asigna un valor guardado a una propiedad de solo lectura. – MoSlo

Respuesta

5

Con PropertyDescriptor, ingrese IsReadOnly.

Con PropertyInfo, marque CanWrite (y CanRead, para el caso).

También es posible que desee comprobar [ReadOnly(true)] en el caso de PropertyInfo (pero esto ya se maneja con PropertyDescriptor):

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

OMI, PropertyDescriptor es un modelo mejor utilizar aquí; permitirá modelos personalizados.

1

También - See Microsoft Page

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. 
} 
2

me di cuenta de que cuando se utiliza PropertyInfo, la propiedad CanWrite es cierto incluso si el colocador es privada. Este simple cheque funcionó para mí:

bool IsReadOnly = prop.SetMethod == null || !prop.SetMethod.IsPublic; 
Cuestiones relacionadas