我编写了一个方法,使用NuGet中的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 :(得分:2)
如何使用通用ConvertGenericListToDataTable
方法?
public DataTable ConvertGenericListToDataTable<T>(List<T> inputList)
{
}
答案 1 :(得分: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);
}
答案 2 :(得分:0)
您应该使您的CustomobjectA或CustomObjectB继承一个抽象的CustomObject类,该类将用作您的输入参数,就像您在方法中所做的那样。