返回虚拟函数中派生程度最高的类的新实例

本文关键字:新实例 实例 函数 虚拟 派生 程度最 返回 | 更新日期: 2023-09-27 17:59:26

我有一个实现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)构造函数)?

返回虚拟函数中派生程度最高的类的新实例

救援反思:

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

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