46 votes

Obtenir TOUTES les propriétés d'un objet

J'ai un objet comme celui-ci :

some_object

cet objet a environ 1000 propriétés.

J'aimerais passer en revue toutes les propriétés de cette manière :

foreach (property in some_object)
//output the property

Y a-t-il un moyen facile de le faire ?

1 votes

Avez-vous vérifié ces réponses ? stackoverflow.com/questions/737151/

72voto

Chris Trombley Points 809

Vous pouvez utiliser la réflexion.

// Get property array
var properties = GetProperties(some_object);

foreach (var p in properties)
{
    string name = p.Name;
    var value = p.GetValue(some_object, null);
}

private static PropertyInfo[] GetProperties(object obj)
{
    return obj.GetType().GetProperties();
}

Cependant, cela ne résout pas le problème d'un objet ayant 1000 propriétés.

28voto

Despertar Points 5365

Une autre approche possible dans cette situation consiste à convertir un objet en un objet JSON. La bibliothèque JSON.NET facilite cette opération et presque tous les objets peuvent être représentés en JSON. Vous pouvez ensuite parcourir en boucle les propriétés de l'objet sous la forme de paires Nom/Valeur. Cette approche est utile pour les objets composites qui contiennent d'autres objets, car vous pouvez les parcourir en boucle à la manière d'un arbre.

MyClass some_object = new MyClass() { PropA = "A", PropB = "B", PropC = "C" };
JObject json = JObject.FromObject(some_object);
foreach (JProperty property in json.Properties())
    Console.WriteLine(property.Name + " - " + property.Value);

Console.ReadLine();

0 votes

Il s'agit d'une solution simple et fantastique. Elle prend en charge tous les sous-objets automatiquement sans avoir à se soucier de la récursivité ou à saisir toutes les propriétés soi-même.

7voto

Brandon Boone Points 8372
using System.Reflection;  // reflection namespace

// get all public static properties of MyClass type
PropertyInfo[] propertyInfos;
propertyInfos = typeof(MyClass).GetProperties(BindingFlags.Public |
                                              BindingFlags.Static);
// sort properties by name
Array.Sort(propertyInfos,
        delegate(PropertyInfo propertyInfo1, PropertyInfo propertyInfo2)
        { return propertyInfo1.Name.CompareTo(propertyInfo2.Name); });

// write property names
foreach (PropertyInfo propertyInfo in propertyInfos)
{
  Console.WriteLine(propertyInfo.Name);
}

Source : http://www.csharp-examples.net/reflection-property-names/

18 votes

Les dieux de Linq pleurent en ce moment...

2voto

Neil N Points 14566

Vous souhaitez l'une des options suivantes, choisissez celle qui vous convient le mieux :

Réflexion : http://msdn.microsoft.com/en-us/library/136wx94f.aspx

Type dynamique : http://msdn.microsoft.com/en-us/library/dd264741.aspx

Cependant, comme quelqu'un l'a déjà souligné, une classe avec 1000 propriétés est une odeur de code. Il est probablement préférable d'utiliser un dictionnaire ou une collection,

2voto

D. Herzog Points 1

Meilleure version pour les accessoires de recherche profonde, également dans les types de base

public static IEnumerable<PropertyInfo> GetAllProperties(Type t)
{
  if (t == null)
    return Enumerable.Empty<PropertyInfo>();

  BindingFlags flags = BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly;
    return t.GetProperties(flags).Union(GetAllProperties(t.BaseType));
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X