779 Stimmen

Wie erhält man die Liste der Eigenschaften einer Klasse?

Wie erhalte ich eine Liste mit allen Eigenschaften einer Klasse?

1029voto

Marc Gravell Punkte 970173

Reflexion; für eine Instanz:

obj.GetType().GetProperties();

für einen Typ:

typeof(Foo).GetProperties();

zum Beispiel:

class Foo {
    public int A {get;set;}
    public string B {get;set;}
}
...
Foo foo = new Foo {A = 1, B = "abc"};
foreach(var prop in foo.GetType().GetProperties()) {
    Console.WriteLine("{0}={1}", prop.Name, prop.GetValue(foo, null));
}

Nach Feedback...

  • Um den Wert von statischen Eigenschaften zu erhalten, übergeben Sie null als erstes Argument für GetValue
  • Um nicht-öffentliche Eigenschaften zu betrachten, verwenden Sie (zum Beispiel) GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) (die alle öffentlichen/privaten Instanzeigenschaften zurückgibt).

122voto

Lucas Jones Punkte 19251

Sie können verwenden Reflexion um dies zu tun: (aus meiner Bibliothek - so erhält man die Namen und Werte)

public static Dictionary<string, object> DictionaryFromType(object atype)
{
    if (atype == null) return new Dictionary<string, object>();
    Type t = atype.GetType();
    PropertyInfo[] props = t.GetProperties();
    Dictionary<string, object> dict = new Dictionary<string, object>();
    foreach (PropertyInfo prp in props)
    {
        object value = prp.GetValue(atype, new object[]{});
        dict.Add(prp.Name, value);
    }
    return dict;
}

Diese Sache wird nicht für Eigenschaften mit einem Index funktionieren - dafür (es ist immer unhandlich):

public static Dictionary<string, object> DictionaryFromType(object atype, 
     Dictionary<string, object[]> indexers)
{
    /* replace GetValue() call above with: */
    object value = prp.GetValue(atype, ((indexers.ContainsKey(prp.Name)?indexers[prp.Name]:new string[]{});
}

Auch um nur öffentliche Eigenschaften zu erhalten: ( siehe MSDN zu BindingFlags enum )

/* replace */
PropertyInfo[] props = t.GetProperties();
/* with */
PropertyInfo[] props = t.GetProperties(BindingFlags.Public)

Das funktioniert auch bei anonymen Typen!
Nur um die Namen zu bekommen:

public static string[] PropertiesFromType(object atype)
{
    if (atype == null) return new string[] {};
    Type t = atype.GetType();
    PropertyInfo[] props = t.GetProperties();
    List<string> propNames = new List<string>();
    foreach (PropertyInfo prp in props)
    {
        propNames.Add(prp.Name);
    }
    return propNames.ToArray();
}

Das gilt auch für die Werte selbst, oder Sie können sie verwenden:

GetDictionaryFromType().Keys
// or
GetDictionaryFromType().Values

Aber das ist ein bisschen langsamer, würde ich mir vorstellen.

44voto

DDTBNT Punkte 421
public List<string> GetPropertiesNameOfClass(object pObject)
{
    List<string> propertyList = new List<string>();
    if (pObject != null)
    {
        foreach (var prop in pObject.GetType().GetProperties())
        {
            propertyList.Add(prop.Name);
        }
    }
    return propertyList;
}

Diese Funktion dient dazu, eine Liste der Klasseneigenschaften zu erhalten.

33voto

Jacksonkr Punkte 30530

Basierend auf der Antwort von @MarcGravell, hier ist eine Version, die in Unity C# funktioniert.

ObjectsClass foo = this;
foreach(var prop in foo.GetType().GetProperties()) {
    Debug.Log("{0}={1}, " + prop.Name + ", " + prop.GetValue(foo, null));
}

25voto

Jon Limjap Punkte 92084

Sie könnten die System.Reflection Namespace mit dem Type.GetProperties() mehod:

PropertyInfo[] propertyInfos;
propertyInfos = typeof(MyClass).GetProperties(BindingFlags.Public|BindingFlags.Static);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X