2010-08-25 17 views
31

Unten ist ein Code, den ich verwende, um den Anfangsstatus aller öffentlichen Eigenschaften in einer Klasse für IsDirty zu überprüfen.Wie Sie wissen, ob eine PropertyInfo eine Sammlung ist

Was ist der einfachste Weg zu sehen, ob eine Eigenschaft IEnumerable ist?

Cheers,
Berryl

protected virtual Dictionary<string, object> _GetPropertyValues() 
    { 
     return _getPublicPropertiesWithSetters() 
      .ToDictionary(pi => pi.Name, pi => pi.GetValue(this, null)); 
    } 

    private IEnumerable<PropertyInfo> _getPublicPropertiesWithSetters() 
    { 
     return GetType().GetProperties().Where(pi => pi.CanWrite); 
    } 

UPDATE

Was ich ein paar Bibliothekserweiterungen tun liquidiert wurde die Zugabe als

public static bool IsNonStringEnumerable(this PropertyInfo pi) { 
     return pi != null && pi.PropertyType.IsNonStringEnumerable(); 
    } 

    public static bool IsNonStringEnumerable(this object instance) { 
     return instance != null && instance.GetType().IsNonStringEnumerable(); 
    } 

    public static bool IsNonStringEnumerable(this Type type) { 
     if (type == null || type == typeof(string)) 
      return false; 
     return typeof(IEnumerable).IsAssignableFrom(type); 
    } 

Antwort

37
if (typeof(IEnumerable).IsAssignableFrom(pi.PropertyType)) 
+25

Beachten Sie, dass ein String eine IEnumerable ist zu –

+2

Sie löst das Problem http://stackoverflow.com/a/40376537/5996253 –

1

Versuchen folgt

private bool IsEnumerable(PropertyInfo pi) 
{ 
    return pi.PropertyType.IsSubclassOf(typeof(IEnumerable)); 
} 
+3

ich bemerkte kürzlich, dass 'x.IsSubClassOf (y)' falsch zurück, wenn x == y. Wenn die Eigenschaft in diesem Fall vom Typ IEnumerable ist, gibt die Funktion false zurück. –

+1

Das ist interessant, ich habe diese Logik nie wirklich in diesem exakten Kontext benutzt, also bin ich froh, dass du darauf hingewiesen hast. Vielen Dank. –

12

ich mit Fjodor Soikin aber damit einverstanden, dass Enumerable ist nicht, dass meine ist nur eine Sammlung seit Zeichenfolge auch Enumerable ist und gibt die Zeichen nacheinander ...

Deshalb schlage ich mit

if (typeof(ICollection<>).IsAssignableFrom(pi.PropertyType)) 
+1

Sie haben Recht mit der Zeichenfolge natürlich, aber Ihre Lösung schlägt fehl (versuchen Sie es mit der Liste ()). Sehen Sie mein Update für den Code, den ich mit verwendet habe. Prost! – Berryl

+1

Dies schlägt fehl, da kein generierter Typ (wie 'List ') einem generischen Typ zugewiesen werden kann ('ICollection <>') (tatsächlich kann eine Variable vom Typ 'ICollection <> 'nicht deklariert werden). Verwenden Sie besser 'typeof (ICollection)' (wie vom Editor vorgeschlagen), wodurch es auch für nicht-generische Sammlungen funktioniert. –

+0

Sehr viel tatsächlich – Joanvo

Verwandte Themen