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

Поиск

Категории

Облако тегов

acer ado.net amd asp.net c sharp c# cms css exceptions google html ipad iphone it бизнес javascript jquery linq microsoft mysql net nokia nokia lumia samsung seo silverlight sql surface tsql windows 8 windows blue windows phone windows rt xna безопасность библиотека вопросы на собеседовании интересные проекты интернет интернет магазин исключения книга книги компьютерная безопасность компьютерные игры контролы курсы по программированию логированние исключений мобильные приложения монетизация сайтов наушники новости новости it новости microsoft новости интернет новости технологий ноутбук ноутбуки обработка исключений оптимизация острова периферия планшет планшеты поддержка сайтов поисковое продвижение программы продвижение продвижение сайта продвижение сайтов рабство разработка игр разработка сайтов раскрутка сайта рекламные технологии смартфон смартфоны собеседование создание сайтов средства разработки туризм фриланс хостинг яндекс
  << Предыдущий пост       Следующий пост >>  
От: 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


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