在抽象类( C#3 )中,有一个名为GetData
的虚方法,它返回一个DataTable。该方法的算法如下:
在第3点,我克隆了原始的DataTable,以便更改列的类型(我不能在填充的表上执行此操作,并且无法在第2点设置此项)并枚举我复制的每一行并转换原始数据。转换取决于类,每个转换都有自己的私有方法来转换数据。
问题是:如何在基类中创建一个基于以下三个参数的方法:要转换的列名,转换期间新列的类型和操作。首先是两个很简单,但我不确定第三个。我考虑过设计一个新类来存储这三个参数,并将动作存储为以下委托:
public delegate object Convert(object objectToConvert);
转换看起来像这样:
int rowCounter = 0;
foreach(DataRow row in dt.Rows)
{
foreach(var item in Params)
{
row[item.ColumnIndex] = item.Convert(originalDataTable.Rows[rowCounter].ItemArray[item.ColumnIndex]);
}
++rowCounter;
}
现在,我必须在每个我希望进行转换的类中覆盖方法GetData()
,这会导致大量的代码重复。我想要达到的目的是创建一个基于我上面提到的params的基类。以上解决方案是否适合此问题,或者是否有其他方法可以做到这一点?
答案 0 :(得分:1)
首先,我不是DataTable的忠实粉丝,如果你做了foreach,你可以使用DataReader。
using (var dataReader = ....)
{
while(dataReader.Read())
{
foreach(var item in Params)
{
row[item.ColumnIndex] = item.Convert(originalDataTable.Rows[rowCounter].ItemArray[item.ColumnIndex]);
}
}
}
其次,使用带有一些代码的抽象方法创建一个基类,并使列表中的对象Params继承此类,并仅在必要时覆盖该方法。
public class MyClass
{
public abstract object Convert(DataRow row)
{
....
}
}
public class foo : MyClass
{
}
答案 1 :(得分:1)
好的,现在我有一个完全满足我的以下解决方案:
每个转换器都实现以下接口:
public interface IConvertor
{
object Convert(object item);
}
Params 类如下:
Type ColumnType { get; protected set; } // New type
string[] ColumnNames { get; protected set; }
IConvertor Convertor { get; protected set; }
每个对象都有自己的 Params 数组属性。我为每个派生类都有一个方法,我所要做的就是设置参数。