2009-04-10 8 views

Répondre

595

Réflexion; pour une instance:

obj.GetType().GetProperties(); 

pour un type:

typeof(Foo).GetProperties(); 

par exemple:

class Foo { 
    public int A {get;set;} 
    public string B {get;set;} 
} 
... 
Foo foo = new Foo {A = 1, B = "abc"}; 
foreach(var prop in foo.GetType().GetProperties()) { 
    Console.WriteLine("{0}={1}", prop.Name, prop.GetValue(foo, null)); 
} 

commentaires ... Après

  • Pour obtenir le val ue de propriétés statiques, passez null comme premier argument à GetValue
  • Pour rechercher des propriétés non publiques, utilisez (par exemple) GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) (qui renvoie toutes les propriétés d'instance publiques/privées).
+8

Pour être complet, il y a aussi la ComponentModel, exposée par TypeDescriptor.GetProperties (...) - qui permet des propriétés d'exécution dynamique (réflexion est fixé à compile- temps). –

+4

Suggestion: Développez la réponse pour couvrir les propriétés protected/private/static/inherited. – Richard

+1

L'instruction foreach que vous affichez fonctionne même dans la classe pour laquelle vous souhaitez obtenir les propriétés de :) –

6

Vous pouvez utiliser la réflexion.

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

Vous pouvez utiliser Réflexion pour ce faire: (de ma bibliothèque - ce obtient les noms et les valeurs)

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

Cette chose ne fonctionne pas pour les propriétés avec un indice - pour que (il devient difficile à manier):

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

de plus, pour obtenir seulement des propriétés publiques: (see MSDN on BindingFlags enum)

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

Cela fonctionne aussi sur les types anonymes!
obtenir juste les noms:

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

Et il est à peu près la même chose pour seulement les valeurs, ou vous pouvez utiliser:

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

Mais c'est un peu plus lent, j'imagine.

+0

... mais atype.GetProperty (prp.Name) va retourner prp? –

+0

Oh - tu as raison! D'oh. –

+0

Je l'ai réparé maintenant. –

19

Vous pouvez utiliser l'espace de noms System.Reflection avec le Type.GetProperties() mehod:

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

Je suis également confronté à ce genre d'exigence.

De cette discussion, je suis une autre idée,

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

Cette montre également le nom de la propriété.

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

ce nombre de propriétés.

Merci à tous.C'est une bonne discussion.

29
public List<string> GetPropertiesNameOfClass(object pObject) 
{ 
    List<string> propertyList = new List<string>(); 
    if (pObject != null) 
    { 
     foreach (var prop in pObject.GetType().GetProperties()) 
     { 
      propertyList.Add(prop.Name); 
     } 
    } 
    return propertyList; 
} 

Cette fonction permet d'obtenir la liste des propriétés de classe.

+5

Vous pourriez vouloir changer cela pour utiliser 'return return'. Ce n'est pas une grosse affaire, mais c'est une meilleure façon de le faire. –

+1

J'aime ça parce que c'est (presque) la seule réponse qui n'inclut pas le mot * réflexion *. –

+4

Mais cela ** utilise encore ** la réflexion néanmoins. – GGG

5

C'est ma solution

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

Voici amélioré @lucasjones répondre. J'ai inclus les améliorations mentionnées dans la section des commentaires après sa réponse. J'espère que quelqu'un trouvera cela utile.

public static string[] GetTypePropertyNames(object classObject, BindingFlags bindingFlags) 
{ 
    if (classObject == null) 
    { 
     throw new ArgumentNullException(nameof(classObject)); 
    } 

     var type = classObject.GetType(); 
     var propertyInfos = type.GetProperties(bindingFlags); 

     return propertyInfos.Select(propertyInfo => propertyInfo.Name).ToArray(); 
} 
5

Basé sur la réponse de @ MarcGravell, voici une version qui fonctionne dans Unity C#.

ObjectsClass foo = this; 
foreach(var prop in foo.GetType().GetProperties()) { 
    Debug.Log("{0}={1}, " + prop.Name + ", " + prop.GetValue(foo, null)); 
} 
Questions connexes