使用非泛型和反射
如果你要使用的項目反映在列表中(和項目不是值類型)的人回答說,沒有特別的有理由使用通用列表類型。我還建議使用接口而不是特定的類型。例如:
public static DataTable ConvertListToDataTable(IEnumerable list){
foreach (object item in list)
{
//Do Something
}
}
如果您需要在列表中的項目數,您可以使用ICollection
代替IEnumerable
:
public static DataTable ConvertListToDataTable(ICollection list){
if (list.Count > 0)
{
foreach (object item in list)
{
//Do Something
}
}
}
這兩個接口是通用List<>
類來實現的,所以你可以將您的原始列表傳遞給不需要映射的函數。
使用泛型
有使用泛型的好處,特別是類型安全。使用泛型時,通常在用於類型參數的類型之間存在某種通用性。這是使用where
類型約束強制執行的。
在這種特殊情況下,您的方法正在將集合中的項目轉換爲數據表格中的行。項目類型之間的通用性在於它們可以轉換爲數據行。這可以用一個接口來定義,像這樣:
public interface IDataRowConvertible
{
}
public class CameraSettings : IDataRowConvertible
{
}
public static DataTable ConvertListToDataTable<T>(IEnumerable<T> list) where T : IDataRowConvertible
{
// Do something
}
另一個要考慮的是這樣的:反射可能會非常棘手得到的權利。您最終可能會遇到您的基於反射的通用反射解決方案無法達到您想要的效果的情況。例如,假設您將某個屬性添加到您不希望包含在數據行中的某個類中。使用接口可以解決這兩個問題。
讓我們修改界面如下:
public interface IDataRowConvertible
{
void DefineColumns(DataColumnCollection columns);
void WriteToRow(DataRow row);
}
您現在正在負責制定所發生的數據表,以及轉換功能成爲真正通用的項目:
public static DataTable ConvertListToDataTable<T>(ICollection<T> list) where T: IDataRowConvertible
{
if (list.Count > 0)
{
var table = new DataTable();
list.First().DefineColumns(table.Columns);
foreach (var item in list)
{
var row = table.NewRow();
item.WriteToRow(row);
table.Rows.Add(row);
}
return table;
}
return null;
}
的最大的缺點是你所有的產品類都需要實現兩種接口方法。但是,您可以創建一個基於反射的實用工具,使他們更容易實現:
public void DefineColumns(DataColumnCollection columns)
{
ReflectionUtil.DefineColumns(this, columns);
}
public void WriteToRow(DataRow row)
{
ReflectionUtil.WriteToRow(this, row);
}
也許你可以使它通用:'公共靜態數據表ConvertListToDataTable(名單列表)...' –
你能包括一些更多關於你在'ConvertListToDataTable'方法中做什麼的細節?你打算如何使用反射或其他方式進行轉換? –
是的,我希望如此。但不知道如何? –