1

我有一个实现的更清洁的类,IDataReader它的作用是过滤任何DateTime超出 SQL ServerDateTime范围的值并返回DBNull(这个类的输出被输入到 aSqlBulkCopy并且我的数据源可以返回 1/ 1/1753)

我的问题是接口的函数之一返回一个新的IDataReader,我想要的是任何派生类都不需要重写该函数来返回一个新对象本身。这是一个例子

public class SqlServerDataCleaner : IDataReader
{
    public SqlServerDataCleaner(IDataReader dataSource)
    {
        this.dataSource = dataSource;
        //(Snip)
    }

    //(Snip)

    public virtual IDataReader GetData(int i)
    {
        return new SqlServerDataCleaner(dataSource.GetData(i));
    }

}

class SqlServerDataCleanerDerived : SqlServerDataCleaner
{
    public SqlServerDataCleanerDerived (IDataReader dataSource) 
        : base(dataSource)
    {
    }

    //(Snip)

    //Need to return the correct class
    public override IDataReader GetData(int i)
    {
        return new SqlServerDataCleanerDerived (dataSource.GetData(i));
    }

}

有什么方法可以消除对覆盖的需要,GetData以便父类将自动在其副本中创建该类的最派生形式GetData(假设所有派生类将始终具有Classname(IDataReader)构造函数)?

4

1 回答 1

5

救援反思:

public virtual IDataReader GetData(int i)
{
  return (IDataReader)Activator.CreateInstance(GetType(), dataSource.GetData(i));
}

GetType总是返回当前实例的类型,即对于SqlServerDataCleaner它返回的实例typeof(SqlServerDataCleaner)和对于SqlServerDataCleanerDerived它返回的实例typeof(SqlServerDataCleanerDerived)。您可以将此类型传递给Activator.CreateInstance 方法

于 2013-02-14T16:11:29.370 回答