Принципы объектно-ориентированного программирования

         

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



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

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

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

 

Содержание раздела