Хм, то, что вы спрашиваете, не обязательно связано с Аспектно-ориентированным программированием. Скорее всего, в средах AOP часто используются атрибуты для обозначения так называемых «pointcuts», т.е. места, где применяются «советы» (т. е. где тип будет изменен).
Обычно сами атрибуты не изменяют поведение класса; они только «помечают» тип для специального обращения чем-то другим, например, другим фреймворком, библиотекой, переписчиком байт-кода и т. д. ... или просто самим .NET.
Существуют некоторые специальные атрибуты, которые являются неотъемлемой частью .NET, которые «модифицируют» тип даже без необходимости использования какого-либо дополнительного инструмента & mdash; они будут рассматриваться по-разному в среде выполнения .NET. MarshalByRefObjectAttribute
может быть одним из них. SerializableAttribute
- еще одна важная часть .NET BCL, которая занимается сериализацией.
Конструктор Windows Forms для Visual Studio ищет определенные атрибуты, такие как Browsable
, Description
и т. Д.
WCF ищет атрибуты, такие как OperationContract
, DataContract
и т. Д.
Главное, что нужно понять, это то, что кто-то (даже если это сам .NET) должен активно проверять наличие атрибутов и что-то делать с ними; они ничего не делают сами! Это просто данные, аннотированные чем-то другим.
Вы можете написать свои собственные компоненты, которые берут объект и смотрят, есть ли у типа объекта определенные атрибуты (и если так, продолжайте другим способом). Это можно сделать с помощью отражения:
using System.Linq;
using System.Reflection;
…
public class SomeAttribute : Attribute { … }
void DoSomethingWith<T>(T someObject) // (T is only introduced here for
{ // easy reference in the comments below.)
object[] attribute =
someObject.GetType().GetCustomAttributes(typeof(SomeAttribute), true);
if (attribute.Any())
{
// [SomeAttribute] is present on type T, or T inherits the attribute.
}
else
{
// [SomeAttribute] is not present on T.
}
}
См. Также документацию по MSDN: System.Type.GetCustomAttributes