限制自定义属性,以便它只能应用于C#中的特定类型?

thi*_*eek 11 inheritance attributes c#-2.0

我有一个自定义属性,它应用于类属性和类本身.现在,必须应用我的自定义属性的所有类都是从单个基类派生的.

如何限制我的自定义属性,以便它只能应用于那些必须从我的基类派生的类?我该怎么做呢?

Mar*_*ell 15

Darn,我讨厌当我证明自己错了...如果你将属性定义为基类的受保护嵌套类型,它就有效:

abstract class MyBase {
    [AttributeUsage(AttributeTargets.Property)]
    protected sealed class SpecialAttribute : Attribute {}
}

class ShouldBeValid : MyBase {
    [Special]
    public int Foo { get; set; }
}
class ShouldBeInvalid {
    [Special] // type or namespace not found
    [MyBase.Special] // inaccessible due to protection level
    public int Bar{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)

(原始答案)

你不能这样做 - 至少,不是在编译时.

属性可以被限制(例如)"class","struct","method","field"等 - 但没有更精细的.

当然,由于属性本身不做任何事情(忽略PostSharp),它们对其他类型是惰性的(并且对你的类型不敏感,除非你在运行时添加一些代码来查看属性).

你可以写一个FxCop规则,但这似乎有点过分.

不过,我想知道属性是否是最佳选择:

现在,必须应用我的自定义属性的所有类都是从单个基类派生的.

如果他们必须应用您的自定义属性,可能一个abstract(或可能只是virtual)属性/方法将是一个更好的选择?

abstract class MyBase {
    protected abstract string GetSomeMagicValue {get;}
}
class MyActualType : MyBase {
    protected override string GetSomeMagicValue {get {return "Foo";}}
}
Run Code Online (Sandbox Code Playgroud)