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




4 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.

c# .net reflection properties

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




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

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



Questa è la mia soluzione

public class MyObject
{
    public string value1 { get; set; }
    public string value2 { get; set; }

    public PropertyInfo[] GetProperties()
    {
        try
        {
            return this.GetType().GetProperties();
        }
        catch (Exception ex)
        {

            throw ex;
        }
    }

    public PropertyInfo GetByParameterName(string ParameterName)
    {
        try
        {
            return this.GetType().GetProperties().FirstOrDefault(x => x.Name == ParameterName);
        }
        catch (Exception ex)
        {

            throw ex;
        }
    }

    public static MyObject SetValue(MyObject obj, string parameterName,object parameterValue)
    {
        try
        {
            obj.GetType().GetProperties().FirstOrDefault(x => x.Name == parameterName).SetValue(obj, parameterValue);
            return obj;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
}



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.




Related