При определении атрибутов программисту необходим механизм получения их значений. Этот механизм называется рефлексией.
В следующей программе продемонстрирован класс атрибута, его применение к некоторому классу и чтение параметров атрибута посредством рефлексии.
using System;
using System.Reflection;
[AttributeUsage(AttributeTargets.Class)]
public class CodeReviewAttribute: System.Attribute
{
public CodeReviewAttribute(string reviewer, string date)
{
this.reviewer = reviewer;
this.date = date;
}
public string Comment
{
get
{
return(comment);
}
set
{
comment = value;
}
}
public string Date
{
get
{
return(date);
}
}
public string Reviewer
{
get
{
return(reviewer);
}
}
string reviewer;
string date;
string comment;
}
[CodeReview("Eric", "01-12-2000", Comment="Bitchin' Code")]
class Complex
{
}
class Test
{
public static void Main()
{
System.Reflection.MemberInfo info;
info = typeof(Complex);
object[] atts;
atts = info.GetCustomAttributes(typeof(CodeReviewAttribute));
if (atts.GetLength(0) != 0)
{
CodeReviewAttribute att = (CodeReviewAttribute) atts[0];
Console.WriteLine("Reviewer: {0}", att.Reviewer);
Console.WriteLine("Date: {0}", att.Date);
Console.WriteLine("Comment: {0}", att.Comment);
}
}
}
Функция Main() получает объект типа, связанный с типом Complex. Затем она загружает все атрибуты, относящиеся к типу CodeReviewAttribute. Если массив атрибутов не пуст, программа преобразует первый элемент массива к типу CodeReviewAttribute и выводит его значение. Массив может состоять только из одного элемента, поскольку CodeReviewAttribute является атрибутом однократного использования.
В приведенном примере выводится следующий результат:
Reviewer: Eric
Date: 01-12-2000
Comment: Bitchin' Code
Функция GetCustomAttribute() может вызываться и без указания типа, в этом случает она возвращает все пользовательские атрибуты объекта.
0 коммент.:
Отправить комментарий