[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?




Sie können Reflexion verwenden.

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



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önnten den System.Reflection Namespace mit dem Type.GetProperties() -Method verwenden:

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



Related