2010-05-11 58 views
4

我想创建一个方法,它需要一个DataTable或一个DataRowCollection并将其转换为一个泛型类型的数组。事情是这样的:如何创建一个将DataRowCollection转换为C#中泛型类型的对象数组的方法?

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(); 
    } 

问题是此行

result.Add((T)dataRow); 

这给不能转换的System.Data.DataRow到T

如果我做同样的事情,而不使用泛型类型,并确保对象的类具有定义的自定义转换运算符,代码工作正常。

所以现在的问题是,我该如何解决使用泛型的问题?

+0

什么样的会? – Kate 2011-02-18 22:03:42

回答

4

你可以使用一个对象,它提供一个DataRow你的类型转换:

public interface IDataRowConverter<T> 
{ 
    T Convert(DataRow row); 
} 

提供定制转换器给你的函数:

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 class MyObjectDataRowConverter : IDataRowConverter<MyObject> 
{ 
    public MyObject Convert(DataRow row) 
    { 
     MyObject myObject = new MyObject(); 

     // Initialize object using the row instance 

     return myObject; 
    } 
} 

然后,您可以使用以下代码调用您的函数:

MyObject[] objectArray = 
    ConvertToArray<MyObject>(datatable, new MyObjectDataRowConverter()); 
+0

我可以使用我希望能够转换的类上定义的隐式转换方法吗?它们看起来像这样: 公共静态隐式操作符发布(DataRow dataRow){//重新创建一个发布对象的东西} – Olle 2010-05-11 09:49:53

+0

如果你想使用一个通用的实现,你想使用的任何操作都必须在通用类型上定义。 在使用泛型实现时,不能在函数中使用该运算符,因为.net不允许运算符约束。 但是,使用所描述的方法,您可以在实现Converter类时使用该操作符。 – 2010-05-11 10:53:12

+0

好的,非常感谢!那么我必须这样做。谢谢! – Olle 2010-05-11 12:01:44

相关问题