【问题标题】:Converting different object lists into a DataTable using FastMember使用 FastMember 将不同的对象列表转换为 DataTable
【发布时间】:2013-08-01 09:24:14
【问题描述】:

我编写了一个方法,该方法使用来自 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&lt;CustomobjectA&gt;List&lt;CustomobjectB&gt; 等等。 为我想要转换为 DataTable 的每种类型的列表编写方法并不是什么大问题,但这可能会导致一遍又一遍地重复相同的代码行,这显然是我想要防止的事情

我尝试将参数的类型更改为List&lt;object&gt;List&lt;dynamic&gt;。 然后我的代码将无法编译,因为:“ConvertGenericListToDataTable 的最佳重载方法匹配有一些无效参数”。

有没有一种方法可以将对象列表作为参数传递而无需定义对象的确切类型?

【问题讨论】:

标签: c#


【解决方案1】:

如果有一个通用的ConvertGenericListToDataTable 方法呢?

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

【讨论】:

    【解决方案2】:

    为“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);
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        我试过了,效果很好

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-04-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多