我有一个基类数据集和几个派生类(datasetseries,datasetable,…)。派生类的构造函数都只接受一个参数,该参数的类型特定于派生类,例如。
public DataSetSeries(Series s);
public DataSetTable(Table t);
我已经编写了一个(通用)工厂类,它允许我从相应的原始数据类型创建数据集子类的实例,例如。
DataSet aDataSetSeries = DataSet.Factory.Create(aSeries);
DataSet aDataSetTable = DataSet.Factory.Create(aTable);
其中dataset.factory是数据集的静态只读字段。create所做的是确定其参数的类型,然后尝试从字典中查找相应的构造函数委托(以前已注册过),并在委托存在的情况下执行该委托。
所以我必须在工厂注册每个派生类的构造函数。为了将相似的东西紧密地联系在一起,并且不要忘记为任何新的数据集子类添加注册,我希望在派生的数据集类中进行注册,而不是在数据集本身中进行注册(从严格的OO意义上来说,它不应该知道它的任何派生类)。因为工厂是静态的,所以我试图在每个派生的数据集中包括一个静态构造函数,例如。
public class DataSetSeries: DataSet
{
static DataSetSeries()
{
Factory.Register(typeof(Series), data => new DataSetSeries((Series)data));
}
// ...
}
但现在我的问题是:
只有在首次使用DataSetSeries时才会调用DataSetSeries的静态构造函数
.但我要做的第一件事是调用dataset.factory.create(aseries),它不是数据集的一种方法,因此根本没有数据集的第一次使用。
因此,永远不会调用静态构造函数
.
如果不明确地迭代所有派生类型(这是首先建立工厂的原因),我如何才能使这项工作正常进行?