2010-06-15 18 views
10

Si tengo algo como:PropertyInfo FijarValor y nulos

object value = null; 
Foo foo = new Foo(); 

PropertyInfo property = Foo.GetProperties().Single(p => p.Name == "IntProperty"); 
property.SetValue(foo, value, null); 

Entonces foo.IntProperty consigue el sistema de 0, a pesar de que value = null. Parece que está haciendo algo como IntProperty = default(typeof(int)). Me gustaría arrojar un InvalidCastException si IntProperty no es un tipo "anulable" (Nullable<> o referencia). Estoy usando Reflection, así que no sé el tipo con anticipación. ¿Cómo voy a hacer esto?

Respuesta

12

Si tiene el PropertyInfo, puede consultar el .PropertyType; si .IsValueType es cierto, y si Nullable.GetUnderlyingType(property.PropertyType) es nulo, entonces es un tipo de valor no anulable:

 if (value == null && property.PropertyType.IsValueType && 
      Nullable.GetUnderlyingType(property.PropertyType) == null) 
     { 
      throw new InvalidCastException(); 
     } 
+0

Eso es todo. Estaba jugando con .PropertyType.IsClass, pero no estaba llegando muy lejos. –

1

Puede utilizar la expresión PropertyInfo.PropertyType.IsAssignableFrom (value.GetType()) para determinar si valor especificado puede escribirse en la propiedad. Pero lo que necesita para manejar el caso cuando el valor es nulo, por lo que en este caso se puede asignar a la propiedad sólo si el tipo de propiedad es anulable o tipo de propiedad es de tipo de referencia:

public bool CanAssignValueToProperty(PropertyInfo propertyInfo, object value) 
{ 
    if (value == null) 
     return Nullable.GetUnderlyingType(propertyInfo.PropertyType) != null || 
       !propertyInfo.IsValueType; 
    else 
     return propertyInfo.PropertyType.IsAssignableFrom(value.GetType()); 
} 

Además, puede encontrar útil Convert.ChangeType método para escribir valores convertibles a la propiedad.

+0

SetValue() ya arroja una excepción cuando no puede establecer el valor, que es el comportamiento deseado (pero es una excepción ArgumentException). Solo necesito manejar el escenario nulo. –

Cuestiones relacionadas