gpt4 book ai didi

c# - LambdaExpression.CompileToMethod 不适用于 System.Type?

转载 作者:行者123 更新时间:2023-11-30 15:08:08 25 4
gpt4 key购买 nike

我正在尝试制作一种编程语言。尝试将 lambda 编译成模块时会出现问题,更准确地说,是在尝试使用 Convert.ChangeType 而不是 t.Parse 将字符串转换为 t(某种类型)时出现问题。如果我使用 LambdaExpression.Compile 并在委托(delegate)上使用 DynamicInvoke 它可以工作,但是如果我使用 CompileToMethod 并生成一个模块 (abc.exe) 并使用 Convert.ChangeType 进行转换,它会在我运行模块时抛出异常:System.TypeAccessException 未处理 Message=尝试通过方法“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))

只需一点小改动,一切似乎都能正常工作。将常量创建为 Type 类型会让一切都变得愉快。

关于c# - LambdaExpression.CompileToMethod 不适用于 System.Type?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5934876/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com