Я вижу данную расылку, как аналог премодерируемой конференции.
Т.е. здесь мы, люди изучающие и использующие платформу .NET,
сможем обменяться своими находками и идеями.
Присылайте письма с вопросами и ответами на адрес
level3@mail.ru,
они будут помещены в рассылку с указанием имени и (по желанию) адреса
автора,
если они соответствуют тематике.
На письма с очень часто задаваемыми вопросами я постараюсь ответить
не помещая их в рассылку, таким образом, надеюсь, что подписка
будет интересной для Вас.
Сегодня было прислано первое письмо, автор которого был весьма лаконичен
(видимо я должен был догадаться, что это сайт,
созданный с использованием технологий .NET, но
у меня к сожалению, закончился траффик до конца месяца,
я так и не знаю, что это такое ;) ):
-----Original Message-----
From: Alexei Nazemnov [mailto:nazemnov@technoNOlinkSPAM.ru]
Sent: Wednesday, August 29, 2001 1:52 PM
To: level3@mail.ru
Subject: .NET
http://shop.tl.ru/
В качестве возможных применений - реализация сериализации, маршаллинга,
устойчивости,
мостов между объектами и реляционными базами, в визуальных дизайнерах
(какие еще?)
Атрибуты могут использоваться везде, где раньше использовалась
Run Time Type Information (RTTI),
кроме того, на уровне методов и атрибутов.
Атрибуты вписываются в текст программы между квадратными скобками и
разделяются
запятыми. Порядок следования атрибутов не важен.
Один атрибут состоит из имени и параметров. Параметры бывают позиционные
(те, которые передаются в конструктор атрибута) и именованные. Именованные
атрибуты - это имя некоторого свойства, знак равенства и значение свойства.
using System;
// Ex 1: [AttributeUsage(AttributeTargets.Class |
AttributeTargets.Interface)]
// Ex 2: [AttributeUsage(AttributeTargets.All, AllowMultiple = true)]
// Ex 3: [AttributeUsage(AttributeTargets.Method, Inherited = false)]
[AttributeUsage(AttributeTargets.Method)]
public class SomeAttribute : System.Attribute
{
...implementation...
public SomeAttribute(...parameters...)
{
...
}
}
При использовании AttributeUsage (точнее System.AttributeUsageAttribute),
свойство ValidOn, передаваемое через конструктор атрибута,
задает элементы кода, к которым применим атрибут (в данном случае методы).
Inherited по умолчанию имеет значение true, AllowMultiple - false.
Элементы кода, к которым можно приписать атрибуты:
По группам
По
алфавиту
All
ClassMembers
Assembly
Module
Class
Struct
Interface
Method
Constructor
Field
Property
Parameter
ReturnValue
Delegate
Enum
Event
All
Assembly
Class
ClassMembers
Constructor
Delegate
Enum
Event
Field
Interface
Method
Module
Parameter
Property
ReturnValue
Struct
All - атрибут может применяться ко всем элементам
ClassMembers - атрибут может применяться к
классам/структурам/интерфейсам и их элементам
Если есть два класса с именами Some и SomeAttribute, то при сопоставлении
имени атрибута и имен этих классов будет выбрано более точное совпадение.
Однако, если есть класс, оканчивающийся на Attribute, то имя атрибута
может быть автоматически дополнено,
поэтому рекомендуется добавлять слово Attribute к имени создаваемого класса
[AttributeUsage(AttributeTargets.All)]
public class XAttribute: System.Attribute {}
[X] // refers to XAttribute
class Class1 {}
[XAttribute] // refers to XAttribute
class Class2 {}
Метод Attribute.GetCustomAttributes игнорирует классы,
не являющиеся наследниками класса System.Attribute, поэтому
рекомендуется наследовать создаваемый класс от класса System.Attribute.
Кто-нибудь пробовал построить прокси-класс для некоторого класса
с помошью System.Reflection.Emit?
Иногда бывает нужно перехватить все обращения к некоторому экземпляру
класса,
например, если нужно иметь возможность временно разрушить объект,
а затем создать его заново так,
чтобы клиенты не знали об этом (типа stateless session beans)
Как запрограммировать вызов методов внутри кода прокси-класса?
Буду рад услышать о других практических применениях упомянутых
и неупомянутых классов - пишите на адрес level3@mail.ru
С уважением и наилучшими пожеланиями,
Сергей Радкевич.