0

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

abstract class BaseClass
{
    private string AlwaysPresent
}

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

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

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

4

2 回答 2

0

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

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

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

如果在设计接口时不知道属性名称或字段,则无法在编译时强制执行您的要求,而只能在运行时强制执行。

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

于 2013-09-29T20:26:32.940 回答
0

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

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

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

于 2013-09-29T22:24:16.733 回答