ГЛАВНАЯ     АРХИВ     НАПИСАТЬ АДМИНУ     ПОДПИСАТЬСЯ НА RSS     ВОЙТИ      

Поиск

Категории

Облако тегов

  << Предыдущий пост       Следующий пост >>  
От: ironMan
16. августа 2011 03:53

Чтобы запросить тип или член о прикрепленных к ним атрибутах, нужно применить отражение (reflection).

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



using System;

public enum RemoteServers
{
DC,
BIND,
COOKER
}

public class RemoteObjectAttribute: Attribute
{
public RemoteObjectAttribute(RemoteServers Server)
{
this.server = Server;
}

protected RemoteServers server;

public string Server
{
get
{
return RemoteServers.GetName(
typeof(RemoteSeirvers), this.server
);
}
}
}

[RemoteObject(RemoteServers.COOKER)]
class MyRemotableClass
{
...
}



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



class ClassAttrApp
{
public static void Main()
{
Type type = typeof(MyRemotableClass);
foreach( Attribute attr in type.GetCustomAttributes(true) )
{
RemoteObjectAttribute remoteAttr = attr as RemoteObjectAttribute;
if (null != remoteAttr)
{
Console.WriteLine("Создайте этот объект на {0} ." , remoteAttr. Server);
}
}
}
}



Как можно ожидать, приложение выдаст следующее:

Создайте этот объект на COOKER.

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



Type type = typeof (MyRemotableClass);



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



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



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



RemoteObjectAttribute remoteAttr = attr as RemoteObjectAttribute;



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



if( null != remoteAttr )
{
Console.WriteLine{"Создайте этот объект на {0}", remoteAttr.Server);
}



( отрывок из книги В. В. Лабор "Си Шарп: Создание приложений для Windows" )

Похожие записи


Вопросы на собеседовании C#, Net, ASP.NET, SQL
Продолжая тему вопросов на собеседовании. Нашел еще одну подборку. Оригинал лежит здесь . Перенес, чтобы не затерялось. Есть вполне вменяемые ответы (хотя, на некоторые вопросы ответил бы по-другому). Ответы находятся после списка вопросов, я их не менял. 23. Что такое шаблон проектирования Model/View/Controller? Как и зачем его применяют? 2...

Запрос информации об атрибутах членов (полей) класса в C#
Чтобы запросить тип или член о прикрепленных к ним атрибутах, нужно применить отражение (reflection).В качестве последнего примера запроса членов как прикрепленных к ним атрибутов мы рассмотрим способ запроса полей класса. Допустим, наш класс содержит поля, значения которых нужно сохранить в реестре. Для этого можно определить атрибут с конструктором, принимающим как ...

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

Добавить комментарий




biuquote
  • Комментарий
  • Предпросмотр
Loading


  Сохранить комментарий