2010-01-20 6 views
17

Je dois parcourir toutes les propriétés dans quelques classes et vérifier toutes les propriétés nullable pour voir si elles ont une valeur. Comment convertir la valeur renvoyée par propertyInfo.GetValue() en un type nullable générique afin que je puisse vérifier la propriété HasValue?Réflexion - vérifier toutes les propriétés valables ont des valeurs

code snipped par souci de concision:

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

ne pouvez-vous pas faire si (propInfo.GetValue (this, null)! = Null)? Ou voulez-vous utiliser explicitement HasValue? –

Répondre

29

note Je suppose que vous voulez dire Nullable<T>; si vous voulez dire Nullable<T> ou une référence, alors vous l'avez déjà: object (à partir de GetValue) - vérifiez simplement null. Dans le cas de Nullable<T>; vous ne pouvez pas convertir en un seul type non générique (autre que object) - mais vous n'en avez pas besoin; il suffit de vérifier que ce n'est pas null, puisque Nullable<T> vide est encadré à null, et GetValue renvoie object (d'où il encadre la valeur).

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>) 
    } 
} 

Pour clarifier, Nullable est une classe de service statique qui est complètement séparé à la struct Nullable<T>; Donc, vous n'avez pas à Nullable. Comme il arrive, Nullable existe pour fournir des choses comme le GetUnderlyingType qui vous aide à travailler avec Nullable<T>.

+0

Bonne réponse, merci. – Paddy

+0

Référence du code source: http://referencesource.microsoft.com/#mscorlib/system/nullable.cs,134 –

0

Puisque vous avez établi que la propriété est de type Nullable<something>, vous savez sa valeur a une propriété HasValue - donc constater que la propriété par la réflexion et obtenir sa valeur.