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