a
、b
和c
的DataTable
转换为具有属性a
、b
和c
的对象(该对象的类将手动编写)。将会有许多不同的DataTable
和许多不同的类需要进行映射,因此我希望创建一个通用机制来执行此数据复制。基本上,我希望得到以下函数:public T Map<T>(DataTable t) where T: new() { ... }
现在,我可以使用反射来实现此功能,但这会很慢。该函数将成为框架的核心,并且经常使用。因此,我正在考虑动态代码生成。第一次在特定类型 T 上运行此方法时,它将执行必要的反射并发出一个匿名方法,该方法执行所有适当的映射。下一次它将只运行该代码。这应该是尽可能高效的。
只有一个问题-我从未在运行时发出过代码。我该怎么做呢?我看了一下表达式,但它们只能执行表达式,而不能执行一系列语句。
然后有 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"];
}
出于简洁起见,我省略了一些其他的内容,但这是问题的核心。