Поиск

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

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

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