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 ?
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 ?
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.
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();
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/
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,
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 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.
1 votes
Avez-vous vérifié ces réponses ? stackoverflow.com/questions/737151/