2013-08-01 56 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; 
} 
相关问题