强制子类在 C# 中定义额外的字段
本文关键字:字段 定义 子类 | 更新日期: 2023-09-27 18:33:18
我的公司有一个基本数据库模型类,该模型类由我们产品的特定实例进行子类化。该类表示数据库中的主键。基类有一个字段,我们将其称为 AlwaysPresent,该字段对于产品的所有实例都是通用的,并且在查询中不使用。
abstract class BaseClass
{
private string AlwaysPresent
}
但要求子类至少再添加一个字段,因为我们稍后将使用反射将这些其他字段视为查询的数据库列名。如果没有其他字段,则无法查询。
所以,我的问题是:是否可以使用 C# 的反射功能强制非抽象子类在不指定其名称的情况下定义新字段?
我是一名Python程序员,我确切地知道如何使用元类在Python中解决此类问题。据我所知,C# 没有元类。而且我不能在基类构造函数中引发异常,因为(出于各种原因(我们不对这些类使用构造函数(只是初始值设定项(,即使我们这样做了,基类构造函数也可能被覆盖。
不能用于强制某些东西。至少在编译时不会。通过反射,您可以阅读类型。在您的情况下,您可以检查其字段,并在运行时需要时抛出异常。
在任何情况下,通常使用属性而不是字段要好得多。属性更具可扩展性,可以更好地隐藏类的内部结构。
强制实施类的特定设计(属性或方法定义(的常用方法是使用接口。还可以有一个实现多个接口的类。
如果在设计接口时不知道属性名称或字段,则无法在编译时强制实施要求,而只能在运行时强制实施。
另一种常见的 c# 技术是使用属性修饰属性或字段。 也许您可以创建自定义属性,并在运行时检查具有该属性的字段(始终使用反射(。
这可以通过方面来完成,特别是PostSharp。它允许您在编译期间执行自定义代码(实际上,它与编译后操作挂钩(在 CompileTimeValidate 中:
http://www.postsharp.net/blog/post/Architectural-Validation
当然,您可以将PostSharp替换为在构建时在后编译时触发的任何自定义代码。
事实证明这不是 C# 中的一个功能,但你可以这样写它来强迫人们实现它
abstract class BaseClass
{
private abstract string GetAlwaysPresent();
}