我正在尝试编写一种编程语言。尝试将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));
}
答案 0 :(得分:4)
我能够重现你得到的异常(这是最难的部分:-))。然后我能够看到更改以下代码是否有所不同:
Expression.Constant(typeof(T))
为:
Expression.Constant(typeof(T), typeof(Type))
只需进行一次小改动,一切似乎都能正常工作。将Constant作为Type类型创建使一切都快乐。