我正在使用FastMember库将对象列表转换为dataTable,但是它返回空对象,因此任何人都可以帮助我解决此问题
List<object> list = new List<object>() { new { Number = 500 } };
DataTable table = new DataTable();
using (var reader = ObjectReader.Create(list))
{
table.Load(reader);
}
最佳答案
显然,Fastmember无法枚举匿名对象的属性。因此,创建的数据读取器没有列,并且DataTable.Load方法拒绝为此读取器创建空行。
如果可以,请尝试使用具体的课程:
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);
}
}
}
编辑:实际上,Fastmember完全能够访问那些属性,但是通用列表(对象)的类型阻止它查看它们。如果可以提供具有实际运行时类型的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" } };
关于c# - FastMember ObjectReader返回0个结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40020589/