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来发射:
我对走这条路线有点担心(因为复杂的公共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);