1

を実装するよりクリーンなクラスがあります。それは、SQL Server の範囲外の値をIDataReaderフィルタリングして代わりに返すことです (このクラスの出力は a に供給され、データ ソースは 1/ より前の日付を返すことができます)。 1/1753)DateTimeDateTimeDBNullSqlBulkCopy

私の問題は、インターフェイスの関数の 1 つが newIDataReaderを返すことです。私が望むのは、派生クラスが関数をオーバーライドして新しいオブジェクト自体を返す必要がないことです。ここに例があります

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 に答える