2008-10-26 19 views
13

ArrayList'te (muhtemelen nesnelerle dolu) almak için bir yöntem yapıyorum ve ArrayList'deki her nesne için tüm alanları (ve onların değerlerini) listeleyeceğim. aşağıdaki gibiBir nesnenin tüm ortak alanlarını C# içinde nasıl bulabilirim?

anda benim kodudur:

Tabii
public static void ListArrayListMembers(ArrayList list) 
    { 
     foreach (Object obj in list) 
     { 
      Type type = obj.GetType(); 
      string field = type.GetFields().ToString(); 
      Console.WriteLine(field); 

     } 
    } 

, ben bu kod ile anında sorunu anlamak: o sadece ArrayList nesnesi başına bir alan basacağımdiye çalıştı eğer. Bunu daha sonra düzeltirim - şu anda sadece bir nesneyle ilişkili tüm ortak alanları nasıl alacağımı merak ediyorum.

DÜZENLEME: Flip-flopping cevapları için çok üzgünüm. Bir cevap seçmeden önce her yöntemi denemeliydim.

+0

Kodunuz bunu yazdıracaktır: System.Reflection.FieldInfo [] –

cevap

21
foreach (Object obj in list) { 
    Type type = obj.GetType(); 

    foreach (var f in type.GetFields().Where(f => f.IsPublic)) { 
     Console.WriteLine(
      String.Format("Name: {0} Value: {1}", f.Name, f.GetValue(obj)); 
    }       
} 

Not bu kod ben alanlarında IsPublic arayan type.GetFields olarak gerekli olmadığını belirtmek istiyorum ;-)

+0

Nevermind. Bu tekniği daha çok seviyorum. Ben de mülkleri (ve hatta yöntemleri) almak için bunu tahmin edebilirim. Çok teşekkürler! – junkforce

+1

.yükseklikteki durum için Thx. Dave .. 10 yıl sonra biliyorum ama hoşuma gidiyor. Basit .. sadece halklar .. hayırseverler için gerek yok .. ve endişelenmeyin hala VS 2017 ile çalışıyor. Net 4.6.2 ve çekirdek: p – Goodies

4
public static void ListArrayListMembers(ArrayList list) 
{ 
    foreach (Object obj in list) 
    { 
     Type type = obj.GetType(); 
     Console.WriteLine("{0} -- ", type.Name); 
     Console.WriteLine(" Properties: "); 
     foreach (PropertyInfo prop in type.GetProperties()) 
     { 
      Console.WriteLine("\t{0} {1} = {2}", prop.PropertyType.Name, 
       prop.Name, prop.GetValue(obj, null)); 
     } 
     Console.WriteLine(" Fields: "); 
     foreach (FieldInfo field in type.GetFields()) 
     { 
      Console.WriteLine("\t{0} {1} = {2}", field.FieldType.Name, 
       field.Name, field.GetValue(obj)); 
     } 
    } 
} 

çalışmak için .NET 3.5 gerektirir() olarak

dönüş değeri - Tip: MSDN durumları tarafından tanımlanır System.Reflection.FieldInfo []

Fieldınfo nesne dizisi temsil eden tüm Geçerli Tür için kamu alanları tanımlanmıştır. Tüm nesneyi elde edebilirsiniz

+0

Hangi namespace PropertyInfo ve FieldInfo içinde? – junkforce

+0

System.Reflection –

+0

System.Reflection –

1
static void ListArrayListMembers(ArrayList list) 
    { 
     foreach (object obj in list) 
     { 
      Type type = obj.GetType(); 
      foreach (FieldInfo field in type.GetFields(BindingFlags.Public)) 
      { 
       Console.WriteLine(field.Name + " = " + field.GetValue(obj).ToString()); 
      } 
     } 
    } 
6

Alanlar BindingFlags ile sınıfta doğrudan ilan: Elbette

GetFields(BindingFlags.Public | BindingFlags.Instance) 
1

, başka bir soru:

GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly) 

ve tüm nesne Alanlar ile kalıtsal dahil "Neden kamusal alanların var?" - Tercih edilen özellikler. Bir soyutlama olarak, yansımanın tek seçenek olmadığını unutmayın: bir türün çalışma zamanında çalışma anında özelliklerini göstermesi de mümkündür (bir türlenmemiş bir DataTable/DataView sütunları özellik olarak nasıl gösterdiği gibi). (Ayrıca basit nesneleri destekleyerek)

Eğer TypeDescriptor kullanmak istiyorsunuz, bunu desteklemek için:

 foreach(PropertyDescriptor prop in TypeDescriptor.GetProperties(obj)) 
     { 
      Console.WriteLine("{0}={1}", prop.Name, prop.GetValue(obj)); 
     } 

Bu aynı zamanda sayısız genişletilebilirlik seçenekleri için izin verir - örneğin, büyük ölçüde speeding up reflection (herhangi bir kod değiştirmeden).

+0

Pretty üzerinde çalışacaksınız.Bu, alt sınıfların çoğunun, alt sınıfların herhangi bir özel bilgisine ihtiyaç duymadan, iki özelliği ("Anahtar" ve "Kod" - bir veritabanı nesneleri sınıfı) olduğunu gösteren soyut bir süper sınıf için genel bir ToString() yapmamı sağladı :) – Nyerguds

İlgili konular