Способ получения атрибута зависит от типа члена, к которому производится запрос. Допустим, вам нужно узнать атрибут, определяющий удаленный сервер, на котором должен быть создан объект. Без атрибутов вам бы пришлось сохранять эту информацию в константе или файле ресурсов приложения. А используя их, можно просто создать аннотацию для класса с именем удаленного сервера, например, так:
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); }