LambdaExpression.CompileToMethod无法使用System.Type?

时间:2011-05-09 09:21:36

标签: c# compiler-construction expression-trees

我正在尝试编写一种编程语言。尝试将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));
    }

1 个答案:

答案 0 :(得分:4)

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

 Expression.Constant(typeof(T))

为:

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

只需进行一次小改动,一切似乎都能正常工作。将Constant作为Type类型创建使一切都快乐。