[C#] Wie bekomme ich die Liste der Eigenschaften einer Klasse?



Answers

Sie können Reflection dazu verwenden: (aus meiner Bibliothek - das erhält 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;
    }

Dieses Ding wird nicht für Eigenschaften mit einem Index funktionieren - dafür (es wird 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 in Enumeration BindingFlags )

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

Dies funktioniert auch bei anonymen Typen!
Um nur 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();
    }

Und es ist nur ungefähr dasselbe für die Werte, oder Sie können verwenden:

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

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

Question

Wie bekomme ich eine Liste aller Eigenschaften einer Klasse?




Ich bin auch mit dieser Art von Anforderung konfrontiert.

Aus dieser Diskussion habe ich eine andere Idee,

Obj.GetType().GetProperties()[0].Name

Dies zeigt auch den Namen der Eigenschaft.

Obj.GetType().GetProperties().Count();

Dies zeigt die Anzahl der Eigenschaften.

Dank an alle. Das ist eine nette Diskussion.




Sie können Reflexion verwenden.

Type typeOfMyObject = myObject.GetType();
PropertyInfo[] properties =typeOfMyObject.GetProperties();



Sie könnten den System.Reflection Namespace mit dem Type.GetProperties() -Method verwenden:

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



Links