5

我编写了一个使用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>and List<dynamic>。然后我的代码将无法编译,因为:“ConvertGenericListToDataTable 的最佳重载方法匹配有一些无效参数”。

有没有一种方法可以在不定义对象的确切类型的情况下将对象列表作为参数传递?

4

4 回答 4

2

有一个通用ConvertGenericListToDataTable方法怎么样?

public  DataTable ConvertGenericListToDataTable<T>(List<T> inputList)
{
}
于 2013-08-01T09:40:47.010 回答
1

为“CustomObject”创建一个接口,它定义了必须是实现“CustomObject”接口的类的一部分的方法和属性。然后确保“Cu​​stomObjectA”和“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);
}
于 2013-08-06T21:01:48.750 回答
0

您应该让您的 CustomobjectA 或 CustomObjectB 继承一个抽象的 CustomObject 类,该类将用作您的输入参数,就像您在方法中所做的那样。

于 2013-08-01T09:36:22.097 回答
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;
}
于 2015-12-20T19:42:11.327 回答