web-dev-qa-db-fra.com

É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 un moyen programmé de les parcourir et de 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?

42
Matt

Utilisez la réflexion. Il est loin d'être aussi rapide qu'un accès à des propriétés codées 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);
}
78
Ben M

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

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

IDictionary<String, String> dictionary = 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é aux valeurs de propriété. Comme le type de propriété est limité à String, il est sûr de convertir la valeur de la propriété en String et le type du type renvoyé est IDictionary<String, String>.

Si vous voulez plutôt toutes les propriétés, vous pouvez le faire comme ceci:

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

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);
3
Karl Wenzel

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

3
Michael Bray