2010-01-20 21 views
17

Tengo que recorrer todas las propiedades en unas pocas clases y verificar las propiedades que admiten valores nulos para ver si tienen un valor. ¿Cómo echo el valor devuelto de propertyInfo.GetValue() a un tipo anulable genérico para que pueda verificar la propiedad HasValue?Reflexión: compruebe que todas las propiedades que admiten nulos tienen valores

Código cortado con tijeras por razones de brevedad:

foreach (PropertyInfo propInfo in this.GetType().GetProperties()) 
{ 
    if (<Snip: Check to see that this is a nullable type>)                  
    { 
      //How do i cast this properly in here to allow me to do: 
      if(!((Nullable)propInfo.GetValue(this, null)).HasValue) 
        //More code here 
    } 
} 
+1

¿no puede simplemente hacer si (propInfo.GetValue (this, null)! = Null)? ¿O quieres usar explícitamente HasValue? –

Respuesta

29

nota Asumo que quiere decir Nullable<T>; Si se refiere a Nullable<T> o una referencia, entonces ya la tiene: object (de GetValue) - simplemente marque null.

En el caso de Nullable<T>; no puede convertir a un solo tipo no genérico (que no sea object), pero no es necesario; simplemente verifique que no es null, ya que Nullable<T> vacío está en caja a null, y GetValue devuelve (de ahí que recubre el valor).

if(Nullable.GetUnderlyingType(propInfo.PropertyType) != null) { 
    // it is a Nullable<T> for some T 
    if(propInfo.GetValue(this, null) != null) { 
     // it has a value (it isn't an empty Nullable<T>) 
    } 
} 

Para aclarar, Nullable es una clase de utilidad estática que es completamente separado a la Nullable<T> struct; para que no lo hagas en el Nullable. Da la casualidad que existe Nullable para proporcionar cosas como GetUnderlyingType que lo ayudan a trabajar con Nullable<T>.

+0

Buena respuesta, gracias. – Paddy

+0

Referencia del código fuente: http://referencesource.microsoft.com/#mscorlib/system/nullable.cs,134 –

0

Puesto que usted ha establecido que la propiedad es de tipo Nullable<something>, usted sabe su valor tiene una propiedad HasValue - por lo que encontrar esa propiedad por la reflexión y obtener su valor.

Cuestiones relacionadas