3 votes

Comment itérer à travers les attributs d'une classe C# (.NET 2.0) ?

Disons que j'ai une classe :

public class TestClass
{
  public String Str1;
  public String Str2;
  private String Str3;

  public String Str4 { get { return Str3; } }

  public TestClass()
  {
    Str1 = Str2 = Str 3 = "Test String";
  }
}

Existe-t-il un moyen (C# .NET 2) de parcourir la classe "TestClass" et d'imprimer les variables publiques et les attributs ?

Se souvenir de .Net2

Merci de votre attention.

9voto

Håvard S Points 11152

Pour parcourir les propriétés publiques de l'instance :

Type classType = typeof(TestClass);
foreach(PropertyInfo property in classType.GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
  Console.WriteLine(property.Name);
}

Pour parcourir les champs publics de l'instance :

Type classType = typeof(TestClass);
foreach(FieldInfo field in classType.GetFields(BindingFlags.Public | BindingFlags.Instance))
{
  Console.WriteLine(field.Name);
}

Si vous souhaitez également inclure des propriétés non publiques, ajoutez BindingFlags.NonPublic aux arguments de GetProperties y GetFields .

1voto

Rubens Farias Points 33357

Vous pouvez utiliser réflexion

TestClass sample = new TestClass();
BindingFlags flags = BindingFlags.Instance | 
    BindingFlags.Public | BindingFlags.NonPublic;

foreach (FieldInfo f in sample.GetType().GetFields(flags))
    Console.WriteLine("{0} = {1}", f.Name, f.GetValue(sample));

foreach (PropertyInfo p in sample.GetType().GetProperties(flags))
    Console.WriteLine("{0} = {1}", p.Name, p.GetValue(sample, null));

1voto

Oded Points 271275

Vous pouvez le faire en utilisant réflexion .

Voici un article qui utilise la réflexion pour l'extensibilité.

0voto

Nitin Midha Points 1971

Pour obtenir les propriétés d'un type, nous utiliserons :

Type classType = typeof(TestClass);
    PropertyInfo[] properties = classType.GetProperties(BindingFlags.Public | BindingFlags.Instance);

Pour obtenir les attributs définis d'une classe, nous utiliserons :

Type classType = typeof(TestClass);
object[] attributes = classType.GetCustomAttributes(false); 

L'indicateur booléen transmis est l'indicateur d'héritage, qui indique si la recherche doit se faire dans la chaîne d'héritage ou non.

Pour obtenir les attributs d'une propriété, nous utiliserons :

propertyInfo.GetCustomAttributes(false); 

En utilisant le code Harvard donné ci-dessus :

Type classType = typeof(TestClass);
object[] classAttributes = classType.GetCustomAttributes(false); 
foreach(PropertyInfo property in classType.GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
  object[] propertyAttributes = property.GetCustomAttributes(false); 
  Console.WriteLine(property.Name);
}

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