Как перебрать атрибуты класса C # (.NET 2.0)? - PullRequest
3 голосов
/ 05 февраля 2010

Скажите, у меня есть класс:

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";
  }
}

Есть ли способ (C # .NET 2) перебирать класс TestClass и распечатывать открытые переменные и атрибуты?

Запомните .Net2

Спасибо

Ответы [ 4 ]

9 голосов
/ 05 февраля 2010

Чтобы просмотреть иные свойства общего экземпляра:

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

Чтобы перебрать открытые поля экземпляра:

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

Если вы также хотите включить непубличные свойства, добавьте BindingFlags.NonPublic к аргументам GetProperties и GetFields.

1 голос
/ 05 февраля 2010

Вы можете сделать это, используя отражение .

Вот статья , которая использует отражение для расширяемости.

1 голос
/ 05 февраля 2010

Можно использовать Отражение

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));
0 голосов
/ 05 февраля 2010

Для получения свойств типа мы будем использовать:

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

Чтобы получить атрибуты, определенные для класса, мы будем использовать:

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

Передан логический флаг, являющийся флагом наследования, независимо от того, выполняется поиск в цепочке наследования или нет.

Для получения атрибутов свойства мы будем использовать:

propertyInfo.GetCustomAttributes(false); 

Используя код Гарварда, указанный выше:

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);
}
...