代码之家  ›  专栏  ›  技术社区  ›  oliver

自动在工厂中注册构造函数

  •  0
  • oliver  · 技术社区  · 8 年前

    我有一个基类数据集和几个派生类(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),它不是数据集的一种方法,因此根本没有数据集的第一次使用。 因此,永远不会调用静态构造函数 .

    如果不明确地迭代所有派生类型(这是首先建立工厂的原因),我如何才能使这项工作正常进行?

    1 回复  |  直到 8 年前
        1
  •  1
  •   olegk    8 年前

    public static class Factory
    {
        static Factory()
        {
            var datasetDerrivedTypes = Assembly
                .GetExecutingAssembly()
                .GetTypes()
                .Where(t => typeof(DataSet).IsAssignableFrom(t) &&
                            t != typeof(DataSet));
    
            foreach (var type in datasetDerrivedTypes)
            {
                System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(type.TypeHandle);  
            }
        }
    
        public static void Register(Type type, Func<Series, DataSet> constructorDelegate)
        {
    
        }
    }
    
    推荐文章