[c#] Come ottenere l'elenco delle proprietà di una classe?


Answers

Puoi usare Reflection per fare ciò: (dalla mia libreria - questo ottiene i nomi e i valori)

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;
    }

Questa cosa non funzionerà per le proprietà con un indice - per quello (diventa ingombrante):

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[]{});
}

Inoltre, per ottenere solo proprietà pubbliche: ( vedi MSDN su BindingFlags enum )

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

Funziona anche su tipi anonimi!
Per ottenere solo i nomi:

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();
    }

Ed è lo stesso per i soli valori, oppure puoi usare:

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

Ma è un po 'più lento, immagino.

Question

Come posso ottenere un elenco di tutte le proprietà di una classe?




Sto anche affrontando questo tipo di esigenza.

Da questa discussione ho avuto un'altra idea,

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

Questo mostra anche il nome della proprietà.

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

questo mostra il numero di proprietà.

Grazie a tutti. Questa è una bella discussione.




È possibile utilizzare lo spazio dei nomi System.Reflection con il Type.GetProperties() :

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



Puoi usare la riflessione.

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



Links