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)