C# 强制使用自定义属性

C# 强制使用自定义属性,c#,attributes,C#,Attributes,情景: 我有一个基类“MyBase”。 我有一个自定义属性“MyAttrib” 我这样做: [MyAttrib(1234)] class MyClass : MyBase() { MyClass() { } } 问题: 我是否可以以任何方式强制从MyBase插入的类具有属性MyAttrib?不,编译器不可能要求使用C#中的属性。你还有其他选择。您可以编写一个单元测试来反映程序集中的所有类型并检查属性。但不幸的是,编译器无法强制使用属性。您可以使用PostSharp来实现这一点。 从OnM

情景: 我有一个基类“MyBase”。 我有一个自定义属性“MyAttrib”

我这样做:

[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的答案