我尝试使用下面的代码创建自定义.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 Reflector我没有看到AttributeUsageAttribute
类声明本身有什么特别之处。不幸的是,这可能只是编译器本身生成的特殊情况。
[Serializable, ComVisible(true), AttributeUsage(AttributeTargets.Class, Inherited=true)]
public sealed class AttributeUsageAttribute : Attribute
{
...
我希望能够指定我的自定义属性只能放在特定类(或接口)的子类上。这可能吗?
答案 0 :(得分:26)
我希望能够指定我的自定义属性只能放在特定类(或接口)的子类上。这可能吗?
实际上,有一种方法可以使用protected
为子类(但不是接口)执行此操作 - 请参阅Restricting Attribute Usage。重现代码(但不是讨论):
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; }
}
答案 1 :(得分:2)
AttributeUsageAttribute
只是一个神奇的类(就像Attribute
本身一样)。这是一个内置的编译器规则,你不能为自己的属性做类似的事情。
答案 2 :(得分:0)
使用ReSharper,您可以使用[JetBrains.Annotations.BaseTypeRequired(typeof(YouBaseType))]