【发布时间】:2017-01-07 10:20:18
【问题描述】:
我现在正在将一些使用表达式的库移植到 .Net Core 应用程序,并遇到了一个问题,即我的所有逻辑都基于 LambdaExpression.CompileToMethod,而这只是缺少。这里是示例代码:
public static MethodInfo CompileToInstanceMethod(this LambdaExpression expression, TypeBuilder tb, string methodName, MethodAttributes attributes)
{
...
var method = tb.DefineMethod($"<{proxy.Name}>__StaticProxy", MethodAttributes.Private | MethodAttributes.Static, proxy.ReturnType, paramTypes);
expression.CompileToMethod(method);
...
}
是否有可能以某种方式重写它以使使用表达式生成方法成为可能?我已经可以使用 Emit 来完成它,但它非常复杂,我想避免它以支持高级表达式。
我尝试使用var method = expression.Compile().GetMethodInfo();,但在这种情况下出现错误:
System.InvalidOperationException : 无法导入全局方法或 来自不同模块的字段。
我知道我可以手动发出 IL,但我需要将 Expression -> 完全转换为绑定到特定 TypeBuilder 的 MethodInfo,而不是在其上构建自己的 DynamicMethod。
【问题讨论】:
-
哇,试图回答这个问题,我刚刚发现 .Net 核心缺少文档,并且没有简单的方法来找出替换了什么......祝你好运进入那个端口......
-
@LucasCorsaletti 我认为提供这样的文档非常困难,因为我想即使是 .net 核心团队也不知道什么被什么取代了 :) 无论如何,谢谢你的尝试
-
有趣,我正在看这个问题。最近刚刚尝试使用 Linq.Expressions 和旧的 .NET 4.5 创建类/实例方法。对于可见性属性,动态方法可以创建为实例方法,但需要 Reflection.Emit。使用 Linq.Expressions 构建它更具可读性,但它不能用作实例方法。但是,我可以无耻地访问内部和私有,从而实现与实例方法相同的功能。我只是运行时代码生成的初学者...
-
@ErikHart 我有一个解决方法,例如方法,see link。因此,上面的代码片段来自这个解决方法,它停止迁移到 .Net Core :)
标签: c# .net .net-core .net-standard