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