如何创建将DataRowCollection转换为C#中泛型类型的对象数组的方法?
我试图创建一个方法,该方法接受DataTable或DataRowCollection并将其转换为泛型类型的数组。大概是这样的:如何创建将DataRowCollection转换为C#中泛型类型的对象数组的方法?,c#,generics,datarow,C#,Generics,Datarow,我试图创建一个方法,该方法接受DataTable或DataRowCollection并将其转换为泛型类型的数组。大概是这样的: public static T[] ConvertToArray<T>(DataTable dataTable) { List<T> result = new List<T>(); foreach (DataRow dataRow in dataTable.Rows)
public static T[] ConvertToArray<T>(DataTable dataTable)
{
List<T> result = new List<T>();
foreach (DataRow dataRow in dataTable.Rows)
result.Add((T)dataRow);
return result.ToArray();
}
无法将System.Data.DataRow转换为T
如果我在不使用泛型类型的情况下执行相同的操作,并确保对象类具有已定义的自定义转换运算符,则代码工作正常
所以现在的问题是,我如何使用泛型来实现这一点?您可以使用一个对象来提供数据行到您的类型的转换:
public interface IDataRowConverter<T>
{
T Convert(DataRow row);
}
公共接口IDataRowConverter
{
T转换(数据行);
}
为您的功能提供自定义转换器:
public static T[] ConvertToArray<T>(DataTable dataTable, IDataRowConverter<T> converter)
{
List<T> result = new List<T>();
foreach (DataRow dataRow in dataTable.Rows)
result.Add(converter.Convert(dataRow));
return result.ToArray();
}
public static T[]ConvertToArray(DataTable DataTable,IDataRowConverter converter)
{
列表结果=新列表();
foreach(dataTable.Rows中的DataRow-DataRow)
Add(converter.Convert(dataRow));
返回result.ToArray();
}
然后,为所需类型实现接口:
public class MyObjectDataRowConverter : IDataRowConverter<MyObject>
{
public MyObject Convert(DataRow row)
{
MyObject myObject = new MyObject();
// Initialize object using the row instance
return myObject;
}
}
公共类MyObjectDataRowConverter:IDataRowConverter
{
公共MyObject转换(数据行)
{
MyObject MyObject=新的MyObject();
//使用行实例初始化对象
返回myObject;
}
}
然后可以使用以下代码调用函数:
MyObject[] objectArray =
ConvertToArray<MyObject>(datatable, new MyObjectDataRowConverter());
MyObject[]对象数组=
ConvertToArray(数据表,新的MyObjectDataRowConverter());
我可以使用我在想要转换的类上定义的隐式转换方法吗?它们看起来是这样的:公共静态隐式操作符Posting(DataRow DataRow){//something that retusn a Posting object}如果要使用泛型实现,则必须在泛型类型上定义要使用的任何操作。在处理泛型实现时,不能在函数中使用运算符,因为.net不允许运算符约束。但是,使用所描述的方法,可以在实现转换器类时使用运算符。
MyObject[] objectArray =
ConvertToArray<MyObject>(datatable, new MyObjectDataRowConverter());