AttributeUsage
Без AttributeUsage атрибут
можно ставить почти везде.
AttributeTargets.Class
оставляет только классы.
Поставить такой атрибут на
метод код не компилирует.
Синтаксис
[AttributeUsage(AttributeTargets.Class)]
class NoteAttribute : Attribute
{
}
Пример
Давайте разрешить атрибут только на классе и пометить класс:
using System;
[AttributeUsage(AttributeTargets.Class)]
class OnlyClassAttribute : Attribute
{
}
[OnlyClass]
class Target
{
}
class Program
{
static void Main()
{
bool res = typeof(Target).IsDefined(typeof(OnlyClassAttribute), false);
Console.WriteLine(res);
}
}
Результат выполнения кода:
True
Пример
Давайте прочитать цель из
метаданных AttributeUsage:
using System;
[AttributeUsage(AttributeTargets.Class)]
class OnlyClassAttribute : Attribute
{
}
class Program
{
static void Main()
{
AttributeUsageAttribute usage = (AttributeUsageAttribute)
Attribute.GetCustomAttribute(
typeof(OnlyClassAttribute),
typeof(AttributeUsageAttribute));
bool res = (usage.ValidOn & AttributeTargets.Class) != 0;
Console.WriteLine(res);
}
}
Результат выполнения кода:
True
Пример
Давайте разрешить атрибут на методе и пометить метод:
using System;
using System.Reflection;
[AttributeUsage(AttributeTargets.Method)]
class OnMethodAttribute : Attribute
{
}
class Target
{
[OnMethod]
public void Run()
{
}
}
class Program
{
static void Main()
{
MethodInfo method = typeof(Target).GetMethod("Run");
bool res = method.IsDefined(typeof(OnMethodAttribute), false);
Console.WriteLine(res);
}
}
Результат выполнения кода:
True
Смотрите также
-
AllowMultiple,
несколько экземпляров -
Inherited,
у наследников -
Attribute,
базовый класс -
Атрибут,
обзор