2011-06-30 17 views
13

Czy istnieje sposób na wyświetlenie wszystkich zmiennych (pól) klasy w języku C#. Jeśli tak, to czy ktoś może podać mi kilka przykładów, jak je zapisać w List i uzyskać je przy użyciu Anonymous Types (var).Jak wyświetlić listę wszystkich zmiennych klasy

+2

Przez "zmienne" rozumie się pola, właściwości lub jedno i drugie? –

+0

Pola, sory i zredagowałem mój post. – Burimi

+1

_Pokaż mi kodek _... Tutaj jest dokument: http://msdn.microsoft.com/en-us/library/sa5z9w50.aspx – sehe

Odpowiedz

32

Twoje pytanie nie jest całkowicie jasne. Brzmi to jak chcesz wartości pól dla danej instancji klasy:

var fieldValues = foo.GetType() 
        .GetFields() 
        .Select(field => field.GetValue(foo)) 
        .ToList(); 

Zauważ, że fieldValues jest List<object>. Tutaj foo jest istniejącą instancją Twojej klasy.

Jeśli chcesz public i pozarządowych public pól, trzeba zmienić flagi wiążących poprzez

var bindingFlags = BindingFlags.Instance | 
        BindingFlags.NonPublic | 
        BindingFlags.Public; 
var fieldValues = foo.GetType() 
        .GetFields(bindingFlags) 
        .Select(field => field.GetValue(foo)) 
        .ToList(); 

Jeśli chcesz jedynie nazwy:

var fieldNames = typeof(Foo).GetFields() 
          .Select(field => field.Name) 
          .ToList(); 

Tutaj Foo to nazwa Twoja klasa.

+0

Pojawia się "Wyrażenie nie może zawierać wyrażeń lambda" z tą składnią –

2
var fields = whateverYourClassType.GetType().GetFields().Select(f => f.Name).ToList(); 
3
myClass.GetType().GetProperties() 
+0

pyta o polach nie właściwości. – user2913184

+0

Pyta o zmienne, a nie pola. –

8

Będzie to lista nazw wszystkich pól w klasie (zarówno publicznych, jak i niepublicznych, zarówno statyczne i pola Instancji):

BindingFlags bindingFlags = BindingFlags.Public | 
          BindingFlags.NonPublic | 
          BindingFlags.Instance | 
          BindingFlags.Static; 

foreach (FieldInfo field in typeof(TheClass).GetFields(bindingFlags)) 
{ 
    Console.WriteLine(field.Name); 
} 

Jeśli chcesz dostać pola na podstawie jakiejś instancji obiektu zamiast użyć GetType zamiast:

foreach (FieldInfo field in theObject.GetType().GetFields(bindingFlags)) 
{ 
    Console.WriteLine(field.Name); 
} 
+0

To zadziałało dla mnie. Próbowałem uzyskać wszystkie wyliczenia w mojej klasie: 'MyEnum enum = (MyEnum) 0;' –

0

Niekoniecznie pada pytanie - ale oto jak aby uzyskać wartości wszystkich właściwości typu Decimal z obiektu o nazwie "inv":

var properties = inv.GetType().GetProperties(); 

foreach (var prop in properties) 
{ 
    if (prop.ToString().ToLower().Contains("decimal")) 
    { 
     totalDecimal += (Decimal)prop.GetValue(inv, null); 
    } 
} 
Powiązane problemy