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




Puoi usare la riflessione.

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



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

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



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.