【发布时间】:2013-07-30 17:29:29
【问题描述】:
我正在编写一种特定类型的对象映射器。基本上我想从具有a、b 和c 字段的DataTable 转换为具有a、b 和c 属性的对象(对象的类将是手写)。将有许多不同的 DataTables 和许多不同的类需要映射到,因此我想创建一个通用机制来执行此数据复制。基本上,我想要以下功能:
public T Map<T>(DataTable t) where T: new() { ... }
现在,我可以使用反射来做到这一点,但这很慢。该功能将是框架的核心,并且会经常使用。所以我正在考虑动态代码生成。第一次在特定的T 上运行此方法时,它将执行必要的反射并发出一个匿名方法,该方法执行所有适当的映射。下一次它将只运行该代码。这应该尽可能高效。
只有一个问题 - 我从未在运行时发出代码。我怎么做?我看了Expressions,但他们只能做,嗯,表达式,而不是一系列语句。
然后是 CodeDOM 和 CSharpCodeProvider。这类作品 - 我可以将 C# 代码生成为字符串,即时编译它,然后获取参考。然而,它涉及 C# 编译器并生成一个全新的内存中程序集。听起来有点……重量级的一种简单方法。
有没有更简单的方法?生成不附加到任何程序集(或附加到现有程序集)的轻量级匿名方法的东西?
好的,因为人们要求举个例子。
这是一个手写的类
class MyBusinessObject
{
public int a;
public string b { get; set; }
}
这是一个手工准备的 DataTable(在现实生活中,这将来自外部库):
DataTable t = new DataTable();
t.AddColumn("a", typeof(int));
t.AddColumn("b", typeof(string));
t.AddRow(42, "Meaning");
这是应该即时生成的方法:
(DataRow drow, MyBusinessObject o) =>
{
o.a = (int)drow["a"];
o.b = (string)drow["b"];
}
为了简洁起见,我省略了一些我需要的其他内容,但这就是问题的核心。
【问题讨论】:
-
答案很大程度上取决于您要达到的目标。提供一个“进行所有适当映射”的特定方法的示例将有很大帮助。
-
AutoMapper 可以解决这个问题吗?
标签: .net code-generation