C# 强制使用自定义属性
情景: 我有一个基类“MyBase”。 我有一个自定义属性“MyAttrib” 我这样做:C# 强制使用自定义属性,c#,attributes,C#,Attributes,情景: 我有一个基类“MyBase”。 我有一个自定义属性“MyAttrib” 我这样做: [MyAttrib(1234)] class MyClass : MyBase() { MyClass() { } } 问题: 我是否可以以任何方式强制从MyBase插入的类具有属性MyAttrib?不,编译器不可能要求使用C#中的属性。你还有其他选择。您可以编写一个单元测试来反映程序集中的所有类型并检查属性。但不幸的是,编译器无法强制使用属性。您可以使用PostSharp来实现这一点。 从OnM
[MyAttrib(1234)]
class MyClass : MyBase()
{
MyClass()
{
}
}
问题:
我是否可以以任何方式强制从MyBase插入的类具有属性MyAttrib?不,编译器不可能要求使用C#中的属性。你还有其他选择。您可以编写一个单元测试来反映程序集中的所有类型并检查属性。但不幸的是,编译器无法强制使用属性。您可以使用PostSharp来实现这一点。 从OnMethodInvocationAspect类(PostSharp)继承属性类,并重写CompileTimeValidate方法 有点相似;尽管情况正好相反(我只希望某个属性可以应用于实现特定接口的类):
我所做的是在
MyBase
类中有一个抽象属性或方法,因此继承类被强制重写(从而实现)这个属性/方法
没有属性那么干净,但在我看来比在运行时检查要好。如果要确保基类型或接口的所有类都有属性,您可以添加一个简单的单元测试,以获取所有派生类,并声明它们各自具有属性,并将单元测试的结果添加到进一步的构建过程中。与我想象中的原始海报不再相关,但这里有一些东西给像我一样好奇这是否可行的人 下面的方法很有效,但遗憾的是,它不是编译时检查,因此我不能诚实地推荐使用它。对于大多数事情,你最好使用界面、虚拟和抽象 所需属性:
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
public class RequiredRandomThingAttribute : Attribute { /* ... */ }
派生类需要它的父类:
public class ParentRequiringAttribute
{
public ParentRequiringAttribute()
{
if (this.GetType().GetCustomAttributes(typeof(RequiredRandomThingAttribute), false).Length == 0)
throw new NotImplementedException(this.GetType().ToString());
}
}
并确认所有功能均有效:
[RequiredRandomThing()]
public class CompleteSubclass : ParentRequiringAttribute { /* ... */ }
public class IncompleteSubclass : ParentRequiringAttribute { /* ... */ }
static public int Main(string[] args)
{
var test1 = new CompleteSubclass();
var test2 = new IncompleteSubclass(); // throws
}
改进验证应该相当容易,但我自己的调查到此为止。我认为如果符合这种情况,这会更干净。请参阅下面@frederik Gheyses的答案