2013-08-01 115 views
5

我已經編寫了一個方法,使用來自NuGet的FastMember將通用列表轉換爲DataTable。使用FastMember將不同的對象列表轉換爲DataTable

這是我的代碼:

public DataTable ConvertGenericListToDataTable(List<CustomObject> inputList) 
{ 
    var dt = new DataTable(); 
    using (var reader = ObjectReader.Create(inputList)) 
    { 
     dt.Load(reader); 
    } 
    return dt; 
} 


var customObject = new List<CustomObject>(); 
var dt = ListToDataTable.ConvertGenericListToDataTable(customObject); 

工作正常。 Customobject是我創建的自定義對象,我有幾個不同的列表,我想傳遞給我的方法:List<CustomobjectA>List<CustomobjectB>等等。 它沒有太大的問題,寫一個方法,我想要轉換爲DataTable的每種類型的列表,但這可能會一遍又一遍地重複相同的代碼行,這是我顯然想要防止

我試着將參數的類型改爲List<object>List<dynamic>。 然後我的代碼不會編譯,因爲:「ConvertGenericListToDataTable的最佳過載方法匹配有一些無效的參數」。

有沒有辦法將對象列表作爲參數傳遞給對象,而無需定義對象的確切類型?

+0

也許你可以使用[泛型](HTTP:// MSDN。 microsoft.com/en-us/library/ms379564%28v=vs.80%29.aspx) – LuigiEdlCarno

回答

1

爲'CustomObject'創建一個接口,該接口定義了必須是實現'CustomObject'接口的類的一部分的方法和屬性。然後確保'CustomObjectA'和'CustomObjectB'繼承'CustomObject'接口,在'CustomObjectA'和'CustomObjectB'中執行所有必需的實現。

爲了使'ConvertGenericListToDataTable'方法接受任何'CustomObject',只需讓它接受實現'CustomObject'接口的任何類。

這樣就可以確保列表中提供的對象具有優秀的方法和屬性。

我可能已經得到了語法錯誤,但這樣的事情:

interface ICustomObject 
{ 
    public string RequiredProperty { get; } 

    public void RequiredMethod(); 
} 

public class CustomObjectA : ICustomObject 
{ 
    public string RequiredProperty 
    { 
     get 
     { 
      return "I'm CustomObjectA"; 
     } 
    } 

    public void RequiredMethod() 
    { 
     // do anything 
    } 
} 

public class CustomObjectB : ICustomObject 
{ 
    public string RequiredProperty 
    { 
     get 
     { 
      return "I'm CustomObjectB"; 
     } 
    } 

    public void RequiredMethod() 
    { 
     // do anything 
    } 
} 

public void AcceptsAllCustomObjects(List<ICustomObject> Cookies) 
{ 
    Console.WriteLine(Cookies[0].RequiredProperty); 
} 
0

你應該讓你的CustomobjectA或CustomObjectB繼承一個抽象的CustomObject類,它將用作你的輸入參數,就像你在你的方法中一樣。

2

如何擁有一個通用的ConvertGenericListToDataTable方法?

public DataTable ConvertGenericListToDataTable<T>(List<T> inputList) 
{ 
} 
0

我想這和它的工作

public static DataTable ConvertGenericListToDataTable<T>(this List<T> inputList) 
{ 
    var dt = new DataTable(); 
    using (var reader = ObjectReader.Create(inputList)) 
    { 
     dt.Load(reader); 
    } 
    return dt; 
} 
相關問題