2011-06-22 20 views
20

Yansımayı kullanma Yinelenen öğeler listesinde (tip bilinmiyor, nesne olacak) yayınlamam gereken bir nesnem var. İzleme penceresini kullanma Nesnemin bir kaç öğe olduğunu ve öğelerin sayısını görebildiğini görebiliyorum. Öğeleri görmek için ağaç görünümünü patlatabiliyorum. Öncelikle, geçirilen nesnenin bir çeşit dizidir (Liste olabilir, nesne olabilir [], vb.). O zaman bu dizi boyunca yinelemeye ihtiyacım var. Ancak, tür dönüşümü yapamıyorum. Ben (kısaltılır) kullanıyorum nasıl İşteC# nesnenin dizilimi

var: Çeşitli farklı tonlarını denedim

private static void Example(object instance, PropertyInfo propInfo) 
    { 
     object anArray = propInfo.GetValue(instance, null); 
     ArrayList myList = anArray as ArrayList; 
     foreach (object element in myList) 
     { 
      // etc 
     } 
    } 

. Yukarıdakiler bir istisna oluşturmaz, ancak bir Array aslında var olduğunda ve öğeler içerdiğinde mylist boştur. Kaydedilmekte olan asıl örnek, güçlü bir şekilde yazılan Liste <> 'dır, ancak gerektiğinde sınırlı bir form alt kümesini alabilir. Ancak uygulamanın amacı, bu Örnek() yönteminin, özelliğin temel türünü bilmemesidir.

+0

Eğer instance.GetType (nesne türünü öğrenebilirsiniz) ile, is' 'örneğin kullanarak desirebale türüyle karşılaştırabilirsiniz 'if (instance.GetType(), IEnumerable'dır)' – Tsar

+1

@Bad Görünen Ad, * is * anahtar sözcüğünün nasıl çalıştığını gösterir, burada yaptığınız şey System.Type'dan System.Collection.IEnumerable'a yayınlanmaya çalışmaktır. System.Type bu arabirimi uygulamadığından çalışmaz. Belki de ** typeof (IEnumerable) .IsAssignableFrom (örnek.GetType()) ** – MattDavey

cevap

41

sadece nesne aslında bir ArrayList ise çalışmak için gidiyor. Örneğin bir System.Array veya System.Collections.Generic.List`1 ile çalışmaz.

Ben

object anArray = propInfo.GetValue(instance, null); 
IEnumerable enumerable = anArray as IEnumerable; 
if (enumerable != null) 
{ 
    foreach(object element in enumerable) 
    { 
     // etc... 
    } 
} 
+0

Wow, hızlı çalışma ve çalışır! Teşekkürler. – GeoffM

+1

Diğerlerine de teşekkürler. – GeoffM

14

IEnumerable'a dökülmeye çalışın. Bu, tüm numaralandırılanlar, diziler, listeler vb. En temel arayüzdür. bir ArrayList bunu Döküm

IEnumerable myList = anArray as IEnumerable; 
if (myList != null) 
{ 
    foreach (object element in myList) 
    { 
     // ... do something 
    } 
} 
else 
{ 
    // it's not an array, list, ... 
} 
1

bu deneyin ... hepsi bu döngü gerçekleştirmek için tek şart olduğundan aslında, IEnumerable bunu döküm ne yapması gerektiğini düşünüyorum:

var myList = anArray as IEnumerable; 
    if (mylist != null) 
    { 
     foreach (var element in myList) 
     { 
      // etc 
     } 
    } 

Ayrıca, kullanıcıların Durumunuza bağlı olarak IEnumerable jenerik türünü belirtmeniz gerekir.

1

Herhangi bir türden (dizi, liste vb.) Oluşan bir koleksiyonsa, IEnumerable'a atayabilirsiniz. Ayrıca PropertyInfo, isterseniz gerçek türünü bulmak için kullanabileceğiniz bir PropertyType özelliği içerir.

1

Basitçe deneyin Bu

string[] arr = ((IEnumerable)yourOjbect).Cast<object>() 
          .Select(x => x.ToString()) 
          .ToArray();