Укажите необходимый базовый класс для целей атрибутов .NET

StackOverflow https://stackoverflow.com/questions/1190649

Вопрос

Я попытался создать пользовательский атрибут .net с кодом ниже, но случайно оставил подкласс. Это создало легко фиксированную ошибку компилятора, показанную в комментарии.

// results in compiler error CS0641: Attribute 'AttributeUsage' is 
// only valid on classes derived from System.Attribute
[AttributeUsage(AttributeTargets.Class)]
internal class ToolDeclarationAttribute
{
    internal ToolDeclarationAttribute()
    {
    }
}

Мой вопрос: как компилятор узнает [AttributeUsage] атрибут может быть применен только к подклассу System.Attribute? Использование .NET Offeruter Я не вижу ничего особенного на AttributeUsageAttribute Классовая декларация. К сожалению, это может быть просто особый случай, созданный самим компилятором.

[Serializable, ComVisible(true), AttributeUsage(AttributeTargets.Class, Inherited=true)]
public sealed class AttributeUsageAttribute : Attribute
{
    ...

Я хотел бы иметь возможность указать, что мой пользовательский атрибут может быть размещен только на подклассах определенного класса (или интерфейса). Это возможно?

Это было полезно?

Решение

Я хотел бы иметь возможность указать, что мой пользовательский атрибут может быть размещен только на подклассах определенного класса (или интерфейса). Это возможно?

На самом деле, есть способ сделать это для подклассов (но не интерфейсов), используя protected - видеть Ограничение использования атрибутов. Анкет Чтобы воспроизвести код (но не обсуждение):

abstract class MyBase {
    [AttributeUsage(AttributeTargets.Property)]
    protected sealed class SpecialAttribute : Attribute {}
}
class ShouldBeValid : MyBase {
    [Special] // works fine
    public int Foo { get; set; }
}
class ShouldBeInvalid { // not a subclass of MyBase
    [Special] // type or namespace not found
    [MyBase.Special] // inaccessible due to protection level
    public int Bar{ get; set; }
}

Другие советы

AttributeUsageAttribute это просто волшебный класс (как Attribute сам есть). Это встроенное правило компилятора, и вы не можете сделать что-то подобное для своих собственных атрибутов.

С Resharper вы можете использовать [JetBrains.Annotations.BaseTypeRequired(typeof(YouBaseType))]

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top