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));
    }

LambdaExpression.CompileToMethod 不适用于 System.Type

我能够重现您得到的异常(这是最难的部分:-))。 然后我能够看到更改以下代码是否有所作为:

 Expression.Constant(typeof(T))

自:

 Expression.Constant(typeof(T), typeof(Type))

仅通过一个小小的更改,一切似乎都可以正常工作。 将常量创建为类型类型会使一切快乐。