派生类中的强制属性声明

时间:2012-01-19 13:54:54

标签: c# inheritance reflection attributes

我最近阅读了关于属性和反射的内容,我认为在我的程序中包含元数据是一种很好的方法。我有这个抽象类,我希望从它继承的所有类都向类声明一些属性,因为我希望为我的程序创建自定义组件(那些派生类),并希望在运行时读取这些类的元数据。但是,派生类都必须显式声明我存储元数据的属性。那么如何在派生类中强制执行属性声明?感谢。

5 个答案:

答案 0 :(得分:4)

将属性类定义为自身具有AttributeUsageAttribute属性,其中Inherited属性为true

或者不这样做,因为那是默认的......

派生目标(即属性在类上的类,方法上的方法,等等)将继承该属性而不进行显式声明。

答案 1 :(得分:2)

如果用“强制”,你的意思是“编译时间强制执行”:你不能。

答案 2 :(得分:1)

正如Daniel所说,你不能在编译时强制执行属性。

但是如果你想在运行时读取数据,为什么还要烦恼属性和反射呢?您可以在抽象类中创建抽象方法:

abstract class Base
{
    public abstract string Metadata();
}

class Derived1 : Base
{
    public override string Metadata()
    {
        return "Metadata for Derived1";
    }
}

class Derived2 : Base  // won't compile, since Metadata has not been provided
{
}

当然,行为略有不同。使用此选项,您需要引用派生类的实例,而不仅仅是类型信息本身。另一方面,它避免了反思。

答案 3 :(得分:1)

丹尼尔说你不能在编译时强行。 您可以将属性添加到抽象父级并拾取它们。

另一种选择是添加一个方法来检查父类中是否存在attrribute,如果不存在则抛出异常。用合适的方法调用它。

答案 4 :(得分:0)

由于类似的用例,遇到了这个老问题。在编译时强制使用属性的一种方法是编写一个分析器,类似于 xunit 框架所做的。这是一个例子: https://github.com/xunit/xunit.analyzers/blob/main/src/xunit.analyzers/TheoryMethodMustHaveTestData.cs

需要更多的努力,但可以完成工作。