在虚函数中返回派生类最多的新实例

时间:2013-02-14 16:03:03

标签: c# inheritance constructor override

我有一个实现IDataReader的更干净的类,它的作用是过滤SQL Server DateTime范围之外的任何DateTime值并返回DBNull(这个类的输出被输入SqlBulkCopy,我的数据源可以返回1753年1月1日之前的日期。

我的问题是接口的一个函数返回一个新的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)构造函数)?

1 个答案:

答案 0 :(得分:5)

对救援的反思:

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

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