48 votes

Énumération via les propriétés d'un objet (chaîne) en C #

Disons que j'ai beaucoup d'objets et qu'ils ont de nombreuses propriétés de chaîne.

Existe-t-il une méthode pour les parcourir et sortir le nom de propriété et sa valeur ou doit-il être codé en dur?

Existe-t-il peut-être un moyen LINQ pour interroger les propriétés d'un objet de type 'chaîne' et les sortir?

Devez-vous coder en dur les noms de propriété que vous souhaitez répercuter?

84voto

Ben M Points 14458

Utilisez la réflexion. Il est loin d'être aussi rapide qu'un accès à une propriété codé en dur, mais il fait ce que vous voulez.

La requête suivante génère un type anonyme avec les propriétés Name et Value pour chaque propriété de type chaîne dans l'objet 'myObject':

 var stringPropertyNamesAndValues = myObject.GetType()
    .GetProperties()
    .Where(pi => pi.PropertyType == typeof(string) && pi.GetGetMethod() != null)
    .Select(pi => new 
    {
        Name = pi.Name,
        Value = pi.GetGetMethod().Invoke(myObject, null)
    });
 

Usage:

 foreach (var pair in stringPropertyNamesAndValues)
{
    Console.WriteLine("Name: {0}", pair.Name);
    Console.WriteLine("Value: {0}", pair.Value);
}
 

15voto

Martin Liversage Points 43712

Vous pouvez obtenir toutes les propriétés d'un type à l'aide de la GetProperties méthode. Vous pouvez filtrer cette liste en utilisant LINQ Where méthode d'extension. Enfin, vous pouvez projeter les propriétés à l'aide de LINQ Select méthode d'extension ou un raccourci pratique comme ToDictionary.

Si vous souhaitez limiter l'énumération des propriétés de type String vous pouvez utiliser ce code:

IDictionary<String, String> = myObject.GetType()
  .GetProperties()
  .Where(p => p.CanRead && p.PropertyType == typeof(String))
  .ToDictionary(p => p.Name, p => (String) p.GetValue(myObject, null));

Cela va créer un dictionnaire qui mappe les noms de propriété à la propriété des valeurs. Comme le type de propriété est limitée à String il est sûr d'exprimer la valeur de la propriété à l' String et le type de retour est de type IDictionary<String, String>.

Si vous voulez toutes les propriétés que vous pouvez le faire comme ceci:

IDictionary<String, Object> =  myObject.GetType()
  .GetProperties()
  .Where(p => p.CanRead)
  .ToDictionary(p => p.Name, p => p.GetValue(myObject, null));

3voto

Karl Wenzel Points 588

Si votre objectif est simplement de sortir les données stockées dans les propriétés de l'objet en utilisant un format lisible par l'homme, je préfère simplement sérialiser l'objet au format JSON.

 using System.Web.Script.Serialization;
//...

string output = new JavaScriptSerializer().Serialize(myObject);
 

3voto

Michael Bray Points 7397

Vous pouvez utiliser la réflexion pour ce faire .... il y a un article décent chez CodeGuru , mais c'est peut-être plus que ce que vous recherchez ... vous pouvez en tirer des leçons, puis l'adapter à vos besoins.

-3voto

Axl Points 3077

Que diriez-vous quelque chose comme ça?

 public string Prop1
{
    get { return dic["Prop1"]; }
    set { dic["Prop1"] = value; }
}

public string Prop2
{
    get { return dic["Prop2"]; }
    set { dic["Prop2"] = value; }
}

private Dictionary<string, string> dic = new Dictionary<string, string>();
public IEnumerable<KeyValuePair<string, string>> AllProps
{
    get { return dic.GetEnumerator(); }
}
 

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