LambdaExpression.CompileToMethod 不适用于 System.Type
本文关键字:System Type 适用于 不适用 CompileToMethod LambdaExpression | 更新日期: 2023-09-27 17:55:48
我正在尝试制作一种编程语言。尝试将lambda编译为模块时会出现此问题,更准确地说,当尝试使用Convert.ChangeType而不是t.Parse从字符串转换为t(某种类型)时。如果我使用 LambdaExpression.Compile 并在委托上使用 DynamicInvoke,它可以工作,但是如果我使用 CompileToMethod 并生成一个模块 (abc.exe) 并使用 Convert.ChangeType 进行转换,当我运行模块时它会抛出异常:System.TypeAccessException 未处理 消息=尝试通过方法"Foo.Main()"访问类型"System.RuntimeType"失败。
用于转换的方法:
private static Expression ConvertExpression<T>(Expression exprToConvert)
{
Type[] types = new Type[] { typeof(object), typeof(Type) };
MethodInfo changeTypeMethod = typeof(System.Convert).GetMethod("ChangeType", types);
Expression convertedExprAsObject = Expression.Call(changeTypeMethod, exprToConvert, Expression.Constant(typeof(T)));
return Expression.Convert(convertedExprAsObject, typeof(T));
}
我能够重现您得到的异常(这是最难的部分:-))。 然后我能够看到更改以下代码是否有所作为:
Expression.Constant(typeof(T))
自:
Expression.Constant(typeof(T), typeof(Type))
仅通过一个小小的更改,一切似乎都可以正常工作。 将常量创建为类型类型会使一切快乐。