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

         

Атрибуты класса



Атрибуты класса

Способ получения атрибута зависит от типа члена, к которому производится запрос. Допустим, вам нужно узнать атрибут, определяющий удаленный сервер, на котором должен быть создан объект. Без атрибутов вам бы пришлось сохранять эту информацию в константе или файле ресурсов приложения. А используя их, можно просто создать аннотацию для класса с именем удаленного сервера, например, так:

using System;

public enum RemoteServers

{


JEANVALJEAN,

JAVERT,

COSETTE }

public class RemoteObjectAttribute : Attribute

{

public RemoteObjectAttribute(RemoteServers Server)

{

this, server = Server;

}

protected RemoteServers server;

public string Server

<

get

{

return RemoteServers.GetName(typeof(RemoteServers),

this, server);

} } }

t RemoteObj ect(RemoteSe rve rs.COSETTE)]

class MyRemotableClass

{

}

Сервер, на котором нужно создавать объект, можно определить так:

class ClassAttrApp {

public static void Main() {

Type type = typeof(MyReraotableClass);

foreach (Attribute attr in type.GetCustomAttributesQ)

{

RemoteObjectAttribute remoteAttr = attr as RemoteObjectAttribute; if (null != remoteAttr) {

Console.WriteLine("Co3flai*Te этот объект на {0}.",

remoteAttr. Server); } } } }

Как можно ожидать, приложение выдаст следующее: Создайте этот объект на COSETTE.

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

Первая строка в методе Main использует оператор typeof:

Type type = typeof(MyRemotableClass);

Этот оператор возвращает ассоциированный с типом объект System. Туре, который передается как его единственный аргумент. Как только этот объект оказался в вашем распоряжении, к нему можно выполнить запрос.

Относительно следующей строки в пояснении нуждаются два момента:

foreach (Attribute attr in type.GetCustomAttributes(true))

Первый — вызов метода Ту ре.GetCustomAttributes. Этот метод возвращает массив значений типа Attribute, который в этом случае будет содержать все атрибуты, прикрепленные к классу MyRemotableClass. Второй — оператор foreach, циклически обрабатывающий возвращенный массив, помещая каждое последовательное значение в переменную attr типа Attribute.

Следующее выражение использует оператор as, чтобы попытаться преобразовать переменную attr в тип RemoteObjectAttribte:

RemoteObjectAttribute remoteAttr =

attr as RemoteObjectAttribute;

Далее выполняется проверка на пустое значение, которое указывает на наличие сбоя при использовании оператора as. Если значение не пустое, значит, переменная remoteAttr содержит верный атрибут, прикрепленный к типу MyRemotableClass — мы вызываем одно из свойств RemoteObjectAttribute, чтобы вывести имя удаленного сервера:

if (null != remoteAttr) <

Console.WriteLine("Создайте этот объект на {0}",

remoteAttr. Server); }



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