Deseo descubrir automágicamente cierta información en una clase proporcionada para hacer algo similar a la entrada de formulario. Específicamente, estoy usando el reflejo para devolver un valor de PropertyInfo para cada propiedad. Puedo leer o escribir valores en cada propiedad de mi "formulario", pero si la propiedad se define como "int", no podría, y mi programa ni siquiera debería intentar, escribir un valor nulo.Determinar si la propiedad reflejada puede asignarse nula
¿Cómo puedo usar la reflexión para determinar si a una propiedad determinada se le puede asignar un valor nulo, sin escribir una declaración de cambio para verificar para cada tipo posible? En particular, quiero detectar la diferencia entre tipos encuadrados como "int" vs. "int?", Ya que en el segundo caso I do quiero poder escribir un valor nulo. IsValueType e IsByRef no parecen ver la diferencia.
public class MyClass
{
// Should tell me I cannot assign a null
public int Age {get; set;}
public DateTime BirthDate {get; set;}
public MyStateEnum State {get; set;}
public MyCCStruct CreditCard {get; set;}
// Should tell me I can assign a null
public DateTime? DateOfDeath {get; set;}
public MyFamilyClass Famly {get; set;}
}
Tenga en cuenta que necesito para determinar esta información mucho antes de que en realidad intento de escribir el valor, por lo que usar el control de excepciones envuelto alrededor FijarValor no es una opción.
Algo en lo que no pensé pero probé su respuesta en contra de las matrices, como int [] (que puede asignarse nulo). Su respuesta también funcionó correctamente para este caso. – David
Las matrices son tipos de referencia, por lo que funcionan igual que las clases. –
Creo que debe tenerse en cuenta que en el OP, hubo ejemplos que utilizan un int? y DateTime ?, por lo que el primer cheque devolvería true (! type.IsValueType). Me gusta de esta manera mejor que la dada en MSDN, pero me extraña por qué agregaste lo que parece ser una verificación redundante. Tal vez, porque quiere lidiar con todos los casos más allá de lo que se solicitó? – pqsk