Рефлексия

При определении атрибутов программисту необходим механизм получения их значений. Этот механизм называется рефлексией.

В следующей программе продемонстрирован класс атрибута, его применение к некоторому классу и чтение параметров атрибута посредством рефлексии.

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() может вызываться и без указания типа, в этом случает она возвращает все пользовательские атрибуты объекта.

Предлагаю ознакомиться с аналогичными статьями: