2010-08-25 12 views
31

Aşağıda, IsDirty denetimi için bir sınıftaki tüm genel özelliklerin başlangıç ​​durumunu almak için kullanacağım bir kod var.PropertyInfo ürününün koleksiyon olup olmadığını nasıl öğrenebilirim?

Bir özelliğin IEnumerable olup olmadığını görmenin en kolay yolu nedir?

Alkış,
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); 
    } 

GÜNCELLEME

ben şöyle bir kaç kütüphane uzantıları ekleyerek edildi oynamak zorunda kalırdı ne

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

cevap

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

Not çok –

+2

o Geçenlerde x.IsSubClassOf (y) 'yanlış ise x == dönecektir' fark http://stackoverflow.com/a/40376537/5996253 –

1

deneyin

dize de Enumerable ve Karakterleri tek tek döndürür beri Fyodor Soikin ama Enumerable anlamına gelmez aslında katılıyorum
private bool IsEnumerable(PropertyInfo pi) 
{ 
    return pi.PropertyType.IsSubclassOf(typeof(IEnumerable)); 
} 
+3

sorunu çözer y. Bu durumda, özellik aslında 'IEnumerable' türünde olduysa, işlev false döner. –

+1

Bu ilginçtir, dürüstçe bu mantığı tam olarak bu bağlamda kullanmıyorum, bu yüzden bunu işaret ettiğine sevindim. Teşekkürler. –

12

Yani ben kullanmanızı öneririz ... sadece Koleksiyonu

bir dize IEnumerable olduğunu
if (typeof(ICollection<>).IsAssignableFrom(pi.PropertyType)) 
+1

Kurs dizesi hakkında haklısınız, ancak çözümünüz başarısız oluyor (List () ile deneyin). Kullanarak yaradığım kod için güncellemeye bakın. Şerefe! – Berryl

+1

Bu tür bir yapı türü ('List ' gibi) genel bir türe ('ICollection <>') atanamadığı için başarısız olur (aslında, 'ICollection <>' türünde bir değişken bildiremezsiniz). Bu yüzden daha iyi 'typeof (ICollection)' (editör tarafından önerildiği gibi) kullanın, bu da jenerik olmayan koleksiyonlar için çalışmasını sağlayacaktır. –

+0

Çok fazla – Joanvo

İlgili konular