11

如果我正在创建这样的动态类型:

TypeBuilder dynaType = dynaModule.DefineType(typeof(T).Name + "_ORMProxy");

dynaType.AddInterfaceImplementation(typeof(IServiceTable));

// (1) Implement: (String) IServiceTable.TableName { get; }
FieldBuilder tableNameField = dynaType.DefineField("tableName", typeof(String), FieldAttributes.Private);
MethodBuilder tableNamePublicGetAccessor = dynaType.DefineMethod("get_tableName", MethodAttributes.Public);
tableNamePublicGetAccessor...

是否可以将GetAccessor方法设置为表达式树。它们比直接的 IL 更容易使用。

4

3 回答 3

4

是和不是。仅当方法是静态的时,该方法才LambdaExpression.CompileToMethod()允许您将表达式树编译为 a 。它不能用于实现实例方法,我相信这是您在示例中想要的。MethodBuilder

于 2013-06-20T16:03:38.883 回答
3

这正是LambdaExpression.CompileToMethod()方法的用途。

于 2013-06-11T15:43:17.153 回答
2

我正在使用的一个小技巧(仍然有问题)是创建 2 个具有相同签名的函数,1 个静态函数和 1 个获取实例的函数。表达式树使用 MethodBuilder 进行编译,您创建一个(几乎)相同的签名(使用新的 MethodBuilder),您可以为其发出调用静态“双胞胎”函数所需的 IL。

一个例子是这样的(在 C# 中):

//You create a static function (from ExpressionTree) matching signature:
static void MyInstanceFunction(object, string, string, string);

//Then create an instance (HasThis) function matching:
void MyInstanceFunction(string, string, string);

然后在 MethodBuilder 实例上使用 Reflection.Emit 来发射:

  1. 一些调用来检索静态函数的 MethodInfo(在调用 'CreateType' 之前你无法知道这一点),因此我们需要通过与 this.GetType().GetMethod(...) 等效的 IL 来获取它
  2. 将传递给函数的参数(包括“this”,即 LdArg_0)复制到对象数组
  3. 直接调用“Invoke”函数

我有点担心走这条路(因为复杂的公共 API)。但是,我真的需要类型正确声明(和工作)实例方法,而不仅仅是模仿实例行为。到目前为止,这似乎起到了作用。

于 2014-10-06T07:43:27.810 回答