2010-01-20 11 views
17

Ich muss alle Eigenschaften in wenigen Klassen durchlaufen und alle Nullable-Eigenschaften prüfen, um zu sehen, ob sie einen Wert haben. Wie kann ich den von propertyInfo.GetValue() zurückgegebenen Wert in einen generischen Nullwerttyp umwandeln, sodass ich die HasValue-Eigenschaft überprüfen kann?Reflektion - Überprüfen Sie, dass alle Nullable-Eigenschaften Werte haben

-Code der Kürze halber snipped:

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

können Sie nicht tun, wenn (propInfo.GetValue (this, null)! = Null)? Oder möchten Sie HasValue explizit verwenden? –

Antwort

29

note Ich nehme an, Sie Nullable<T> bedeuten; Wenn Sie Nullable<T> oder eine Referenz meinen, dann haben Sie es schon: object (von GetValue) - nur für null überprüfen.

Im Fall von Nullable<T>; Sie können nicht auf einen einzelnen nicht generischen Typ (anders als object) umwandeln - aber Sie müssen nicht; überprüfen Sie einfach, dass es nicht null ist, da leer Nullable<T> ist eingerahmt null, und GetValue gibt object zurück (daher boxt es den Wert).

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

Um zu klären, ist Nullable ein statisches Hilfsklasse, die vollständig getrennt zu dem Nullable<T> struct ist; also nicht zu Nullable überhaupt. Wie es passiert, Nullable existiert Dinge wie die GetUnderlyingType, die Ihnen hilft, mit Nullable<T> arbeiten.

+0

Schöne Antwort, danke. – Paddy

+0

Quellcode-Referenz: http://referencesource.microsoft.com/#mscorlib/system/nullable.cs,134 –

0

Da Sie festgestellt haben, dass die Eigenschaft des Typs Nullable<something>, wissen Sie sein Wert eine HasValue Eigenschaft hat - so diese Eigenschaft durch Reflexion finden und seinen Wert erhalten.

Verwandte Themen