我最近读到了关于属性和反射的文章,我认为在程序中包含元数据是一个很好的方法。我有这个抽象类,我希望从它继承的所有类都用类声明一些属性,因为我希望为我的程序创建自定义组件(那些派生类),并希望在运行时读取这些类的元数据。但是,派生类都必须显式声明用于存储元数据的属性。那么,如何在派生类中强制声明属性呢?谢谢
将属性类定义为自身具有AttributeUsageAttribute
属性,其中Inherited
属性为true
。
或者不要,因为这是默认的。。。
派生目标(也就是说,如果属性在类上,则为类;如果属性在方法上,则是方法,等等)将在没有显式声明的情况下继承该属性。
如果你说的"force"是指"编译时强制执行":你不能。
正如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所说,编译时不能强制执行。您可以将这些属性添加到抽象父级并拾取它们。
另一种选择是添加一个方法来检查父类中是否存在attribute,如果不存在则抛出异常。用合适的方法调用它。
由于类似的用例而遇到这个老问题。在编译时强制使用Attribute的一种方法是编写一个分析器,类似于xunit框架。以下是一个示例:https://github.com/xunit/xunit.analyzers/blob/main/src/xunit.analyzers/TheoryMethodMustHaveTestData.cs
需要付出更多的努力,但要做好工作。