Код, применяющий отражение для запроса атрибута метода, отличается от кода для запроса атрибута класса. В этом примере мы зададим атрибут, который будет использован для определения метода, способного принимать участие в транзакциях:
using System;
using System.Reflection;
public class TransactionableAttribute : Attribute {
public TransactionableAttributeO
{
> }
class TestClass {
[Transactionable]
public void Foo()
{>
public void Bar() {}
[Transactionable] public void Baz() {} >
class MethodAttrApp
{
public static void Main() {
Type type = Type.GetType("TestClass"); foreach(MethodInfo method in type.GetMethodsQ) {
foreach (Attribute attr in
method.GetCustomAtt ributes()) {
if (attr is TransactionableAttribute) {
Console.WriteLine("{0} может участвовать " +
"в транзакции.", method.Name); } } } > }
Этот код выводит следующую информацию:
Foo может участвовать в транзакции. Baz может участвовать в транзакции.
В данном примере достаточно простого присутствия
TransactionableAttribute,
чтобы сообщить коду о том, что метод, для которого указан этот атрибут, может принимать участие в транзакции. Поэтому не определено ни одного его члена, кроме "голого" конструктора без параметров.
TestClass
определен с тремя методами
(Foo, Bar
и
Baz),
два из которых определены как способные принимать участие в транзакциях. Заметьте: для прикрепления атрибута с конструктором, не принимающим параметров, открывающую и закрывающую скобки вводить не требуется.
Дальше еще интересней. Давайте приглядимся к способу запроса методов класса как их атрибутов. Начнем мы с использования
GetType,
статического метода
Туре,
для получения объекта
System. Type
класса
TestClass:
Type type = Type.GetType("TestClass");
Затем мы вызовем метод
Type.GetMethods,
чтоб получить массив объектов
Methodlnfo.
Каждый из этих объектов содержит данные о методе класса
TestClass.
Мы обработаем каждый метод оператором
foreach:
foreach(Method!nfo method in type.GetMethodsO)
Теперь, имея объект
Methodlnfo,
мы можем, вызвав метод
Methodlnfo.-GetCustomAttributes,
получить все атрибуты метода, созданные пользователем. Мы снова произведем циклическую обработку возвращенного массива объектов оператором
foreach:
foreach (Attribute attr in method.GetCustomAttributes(true))
К данному моменту выполнения программы у нас уже есть атрибут метода. Теперь с помощью оператора
is
мы сделаем к нему запрос, является ли он атрибутом
TransactionableAttribute.
Если это так, мы выводим имя метода:
if (attr is TransactionableAttribute) {
Console.Writel_ine("{0} может участвовать в транзакции.",
method.Name); }