C# 派生类中的强制属性声明

C# 派生类中的强制属性声明,c#,inheritance,reflection,attributes,C#,Inheritance,Reflection,Attributes,我最近读到了关于属性和反射的文章,我认为在我的程序中包含元数据是一种很好的方法。我有这个抽象类,我希望从它继承的所有类都用类的某个属性声明,因为我希望为我的程序创建自定义组件(那些派生类),并希望在运行时读取这些类的元数据。但是,派生类都必须显式声明存储元数据的属性。那么如何在派生类中强制进行属性声明呢?谢谢。如果说“强制”,你的意思是“编译时强制”:你不能。正如Daniel所说,你不能在编译时强制属性 但是如果您想在运行时读取数据,为什么还要费心处理属性和反射呢?您可以在抽象类中创建抽象方法:

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

如果说“强制”,你的意思是“编译时强制”:你不能。

正如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
{
}

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

正如Daniel所说,您不能在编译时强制执行。 您可以将属性添加到抽象父级并拾取它们


另一个选项是添加一个方法来检查父类中是否存在属性,如果不存在,则抛出异常。从合适的方法调用该属性。

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

或者不要,因为这是默认值


派生目标(即,如果属性在类上,则为类;如果属性在方法上,则为方法等)将继承属性,而无需显式声明。

由于类似的用例,遇到了这个老问题。在编译时强制使用属性的一种方法是编写分析器,类似于xunit框架所做的。下面是一个例子:


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

但是,问题是我只想从程序集获取元数据,而不需要任何类实例。我该怎么做?@testgo:恐怕,我建议的解决方法对你不适用。