You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 16:42:33