C# 是否可以使用表达式树定义动态类型的方法体?

C# 是否可以使用表达式树定义动态类型的方法体?,c#,reflection,expression-trees,C#,Reflection,Expression Trees,如果我正在创建这样的动态类型: TypeBuilder dynaType = dynaModule.DefineType(typeof(T).Name + "_ORMProxy"); dynaType.AddInterfaceImplementation(typeof(IServiceTable)); // (1) Implement: (String) IServiceTable.TableName { get; } FieldBuilder tableNameField = dynaTy

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

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更容易使用。

这正是它的用途。

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

我使用的一个小技巧(仍然有缺陷)是创建两个具有相同签名的函数,一个是静态函数,一个是实例函数。使用MethodBuilder编译表达式树,然后创建(几乎)相同的签名(使用新的MethodBuilder),为其发出调用静态“twin”函数所需的IL

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

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

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

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

    顺便说一句,属性访问器的常见命名约定是
    get\u X
    ,而不是
    X\u get
    。虽然这很可能无关紧要。事实上,我会改变我的问题。是的,看来你是对的。虽然它似乎没有被记录。我的LINQ表达式树的Java实现没有这样的限制:)。如果你能用Java实现LINQ,我想知道x 1000万.LINQ是怎样一个过载的术语。我所做的是实现LINQ/DLR表达式树API和编译器(带有一些增强)。我使用它纯粹是为了生成运行时代码。它与LINQ的收集/查询相关方面无关。与原始字节码相比,我更喜欢使用声明性表达式树:)。我明白了<代码>与原始字节码相比,我更喜欢使用声明性表达式树-这是肯定的。我想补充一个很好的答案,您可以使用操作码.Tailcall来提高性能。
    //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);