Blazor WASM中DynamicExpresso设Decimal默认数值类型后无法调用库函数求助
解决方案:保留Decimal默认数值类型同时启用字符串/Math方法
当调用SetDefaultNumberType(DefaultNumberType.Decimal)后,DynamicExpresso会重置部分上下文配置,导致默认可用的System.String、System.Math等类型的成员无法被解析。仅调用Reference方法不足以恢复这些成员的访问权限,可通过以下几种方式解决:
方法一:显式启用类型的所有成员
在设置默认数值类型后,使用EnableType方法开启目标类型的所有成员访问权限:
using DynamicExpresso; var interpreter = new Interpreter(); interpreter.SetDefaultNumberType(DefaultNumberType.Decimal); // 启用String和Math类型的所有成员 interpreter.EnableType(typeof(System.String)); interpreter.EnableType(typeof(System.Math)); // 测试字符串方法 var strResult = interpreter.Eval("\"abcdefg\".Substring(2)"); Console.WriteLine(strResult.ToString()); // 测试Math方法 var mathResult = interpreter.Eval("Math.Pow(2, 3)"); Console.WriteLine(mathResult.ToString());
方法二:精准注册单个方法
如果只需要特定方法,可以精准注册目标方法,减少不必要的类型暴露:
using DynamicExpresso; using System.Reflection; var interpreter = new Interpreter(); interpreter.SetDefaultNumberType(DefaultNumberType.Decimal); // 注册String.Substring(int)方法 MethodInfo substringMethod = typeof(string).GetMethod("Substring", new[] { typeof(int) }); interpreter.RegisterMethod(substringMethod); // 注册Math.Pow方法 MethodInfo powMethod = typeof(Math).GetMethod("Pow", new[] { typeof(double), typeof(double) }); interpreter.RegisterMethod(powMethod); // 执行测试 var strResult = interpreter.Eval("\"abcdefg\".Substring(2)"); Console.WriteLine(strResult.ToString()); var mathResult = interpreter.Eval("Math.Pow(2, 3)"); Console.WriteLine(mathResult.ToString());
方法三:通过InterpreterOptions初始化配置
在创建Interpreter实例时,通过InterpreterOptions设置默认数值类型,这种方式不会破坏DynamicExpresso的默认类型引用,无需额外注册:
using DynamicExpresso; var options = new InterpreterOptions { DefaultNumberType = DefaultNumberType.Decimal }; var interpreter = new Interpreter(options); // 直接使用字符串和Math方法 var strResult = interpreter.Eval("\"abcdefg\".Substring(2)"); Console.WriteLine(strResult.ToString()); var mathResult = interpreter.Eval("Math.Pow(2, 3)"); Console.WriteLine(mathResult.ToString());
优先推荐方法三,它最简洁且不会改变默认上下文配置。
内容的提问来源于stack exchange,提问作者Taimur Lak
相关产品推荐
相关产品推荐

