强制子类在C#中定义额外字段

时间:2013-09-29 20:08:27

标签: c# reflection

我公司有一个基础数据库模型类,它由我们产品的特定实例子类化。该类表示数据库中的主键。基类有一个字段,我们称之为AlwaysPresent,它对产品的所有实例都是通用的,不用于查询。

abstract class BaseClass
{
    private string AlwaysPresent
}

但是要求子类至少添加一个字段,因为我们稍后会使用反射将这些其他字段视为查询的数据库列名。如果没有其他字段,我们无法查询。

所以,我的问题是:是否可以使用C#的反射功能强制非抽象子类定义新字段而不指定其名称?

我是一名Python程序员,我知道如何使用元类在Python中解决这类问题。据我所知,C#没有元类。我不能在基类构造函数中引发异常,因为(由于各种原因)我们不为这些类(只是初始化器)使用构造函数,即使我们做了基类构造函数也可以被覆盖。

2 个答案:

答案 0 :(得分:0)

反射不能用来逼迫某事。至少不是在编译时。通过反射,您可以阅读类型。在您的情况下,您可以检查其字段并在运行时根据需要抛出异常。

在任何情况下,通常使用属性而不是字段要好得多。属性更具可扩展性,更好地隐藏类的内部结构。

强制实现类的特定设计(属性或方法定义)的常用方法是使用接口。您还可以拥有一个实现多个接口的类。

如果在设计界面时不知道属性名称或字段,则无法在编译时强制执行您的要求,但仅限于运行时。

另一种常见的c#技术是用属性装饰属性或字段。也许您可以创建自定义属性,并在运行时检查具有该属性的字段(始终使用反射)。

答案 1 :(得分:0)

这可以通过方面完成,特别是PostSharp。它允许您在CompileTimeValidate中编译期间执行自定义代码(实际上,它挂钩了后编译操作):

http://www.postsharp.net/blog/post/Architectural-Validation

您当然可以使用在构建时在后编译上触发的任何自定义代码替换PostSharp。