2010-05-11 60 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

相關問題