Рекурсировать через свойства класса - PullRequest
3 голосов
/ 04 марта 2010

Взять этот пример класса в качестве примера:

    [AttributeUsage(AttributeTargets.All, AllowMultiple=true)]
public class BugFixAttribute : System.Attribute
{
    public int BugId { get; private set; }
    public string Programmer { get; private set; }
    public DateTime Date { get; private set; }
    public string Comments { get; set; }
    public string RefersTo { get; set; }

    public BugFixAttribute(int bugId = 0, string programmer = "")
    {
        this.BugId = bugId;
        this.Programmer = programmer;
        Date = DateTime.Now;
    }
}

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

object[] attr = info.GetCustomAttributes(typeof(BugFixAttribute), false);
foreach (object attribute in attr)
{
    BugFixAttribute bfa = (BugFixAttribute) attribute;
    Debug.WriteLine(string.Format("\nBugId: {0}", bfa.BugId));
    Debug.WriteLine(string.Format("Programmer: {0}", bfa.Programmer));
    //...
}

Потому что мне нужно распечатать их в файл. Итак, как я могу пройти через свойства вместо выполнения Debug.WriteLine() через все из них, есть ли способ или я должен выписать это.

Ответы [ 5 ]

6 голосов
/ 04 марта 2010

Я бы предположил, что это, вероятно, не очень хорошее использование для атрибутов, так как оно запутывает метаданные, прикрепленные к коду. Если вы хотите стандартизировать способ получения такой информации об исправлениях ошибок, я бы предложил создать тег XML Comment, а затем включить XML Comments для вашего проекта и использовать его вместо этого.

Пример синтаксиса:

/// <summary>This Method Does Something</summary>
/// <BugFix BugId="1234" Programmer="Bob" Date="2/1/2010">Fix Comments</BugFix>
public void MyMethod()
{
    // Do Something
}
4 голосов
/ 04 марта 2010

Да, если вы используете отражение:

Type t = bfa.GetType();
PropertyInfo[] properties = t.GetProperties();
foreach(var prop in properties)
{
    Debug.WriteLine(string.Format("{0}: {1}", prop.Name,prop.GetValue(bfa,null)));
}

Это напечатает имя и значение всех открытых свойств в bfa .Вы можете проверить свойство CanRead в PropertyInfo, чтобы проверить, можно ли его прочитать (т. Е. Если он объявляет получатель).В примере произойдет сбой, если одно из свойств доступно только для чтения или проиндексировано - если это может произойти, необходимо проверить это в коде.

2 голосов
/ 04 марта 2010

Я люблю Linq за такие вещи

var props = from b in info.GetCustomAttributes(typeof(BugFixAttribute), false)
            from p in b.GetType().GetProperties()
            select new { 
                   Name = p.Name,
                   Value = p.GetValue(p.GetValue(b, null))
                   };

foreach(var prop in props)
{
    Debug.WriteLine(string.Format("{0}: {1}", prop.Name, prop.Value));
}
0 голосов
/ 04 марта 2010
foreach (var (BugFixAttribute)attribute in attr)
{
    foreach(PropertyInfo prop in attribute.GetType().GetProperties())
    {
        Debug.WriteLine(string.Format("{0}: {1}", prop.name,prop.GetValue(attribute,null));
    }
}
0 голосов
/ 04 марта 2010

Если я правильно прочитал вопрос, вы ищете более простой способ выписать информацию о классе, верно? У вас есть два варианта:

  1. отражение, для очень универсального решения, которое будет выводить слишком много информации (если предположить, что это java - или .NET, который мне сказали, очень похож ...)
  2. определить метод toString () и вызвать Debug.WriteLine (bfa)

Решение 1, вероятно, way overkill. Вы, вероятно, получите выходные данные для вещей, которые вам не нужны, и вы не сможете получить личные значения.

Решение 2 - это простой способ.

public class BugFixAttribute : System.Attribute
{
 ...

 public String toString(){
   return string.Format("\nBugId: {0}\nProgrammer: {1}", this.BugId, this.Programmer));
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...