FastMember ObjectReader返回0结果

本文关键字:结果 返回 ObjectReader FastMember | 更新日期: 2023-09-27 18:12:50

我正在使用FastMember Library将对象列表转换为数据表,但它返回空对象,因此任何人都可以帮助我解决这个问题

List<object> list = new List<object>() { new { Number = 500 } };
DataTable table = new DataTable();
using (var reader = ObjectReader.Create(list))
{
    table.Load(reader);
}

FastMember ObjectReader返回0结果

显然,Fastmember不能枚举匿名对象的属性。因此,创建的数据阅读器没有列和DataTable。加载方法拒绝为此阅读器创建空行。

如果可以的话,尝试使用一个具体的类:

class Thingy
{
    public int Number { get; set; }
}
class Program
{
    static void Main(string[] args)
    {
        List<Thingy> list = new List<Thingy>() { new Thingy { Number = 500 } };
        DataTable table = new DataTable();
        using (var reader = ObjectReader.Create(list))
        {
            table.Load(reader);
        }
    }
}

Edit:实际上,Fastmember完全能够访问这些属性,但是泛型List(对象)的类型阻止它看到它们。如果您可以提供具有实际运行时类型的IEnumerable,它也应该工作:

//This creates a "strongly" typed list, instead of List<object>:
var list = new[] { (new { Number = 500 }) }.ToList();
DataTable table = new DataTable();
using (var reader = ObjectReader.Create(list))
{
    table.Load(reader);
}

编辑2:还有另一种方法可以通过构造函数将类型信息传递给Fastmember:

List<object> list = new List<object> { new { Number = 500 } };
DataTable table = new DataTable();
// Note that type information is derived directly from the first object in the list, 
// so try not to pass an empty one :)
using (var reader = new ObjectReader(list[0].GetType(), list, null))
{
    table.Load(reader);
}

还要注意,这比其他方法风险更大,因为有可能创建包含混合项类型的列表。Fastmember需要列表中的每一项都是完全相同的类型,像下面这样的操作将导致异常:

//These two items are not of the same type. Look carefully at the "Extra" property:
List<object> list = new List<object> { new { Number = 500, Extra = true }, new { Number = 500, Extra = "Boom" } };