Поиск

Атрибуты метода

Код, применяющий отражение для запроса атрибута метода, отличается от кода для запроса атрибута класса. В этом примере мы зададим атрибут, который будет использован для определения метода, способного принимать участие в транзакциях:

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