Sco*_*ain 1 c# inheritance constructor overriding
我有一个更清洁的类实现IDataReader,它的作用是它过滤DateTime掉SQL Server DateTime范围之外的任何值,然后返回DBNull(此类的输出被输入到a SqlBulkCopy,我的数据源可以返回1之前的日期/ 1753分之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));
}
}
Run Code Online (Sandbox Code Playgroud)
是否有任何方法可以删除对覆盖的需要,GetData因此父类将自动在其副本中创建类的派生形式GetData(假设所有派生类将始终具有Classname(IDataReader)构造函数)?
对救援的反思:
public virtual IDataReader GetData(int i)
{
return (IDataReader)Activator.CreateInstance(GetType(), dataSource.GetData(i));
}
Run Code Online (Sandbox Code Playgroud)
GetType始终返回当前实例的类型,即,SqlServerDataCleaner它返回typeof(SqlServerDataCleaner)的SqlServerDataCleanerDerived实例以及它返回的实例typeof(SqlServerDataCleanerDerived).您可以将此类型传递给Activator.CreateInstance方法.