为何Object类型字符串转JToken报错?直接转String却正常?
问题解析与解决方案
这个现象其实和C#的显式转换运算符工作机制直接相关,咱们一步步拆解清楚:
为什么两种强制转换结果天差地别?
Newtonsoft.Json的JToken类为很多常见类型(比如string)定义了自定义显式转换运算符——简单说就是允许你直接通过(JToken)"abc"这种写法,把字符串转成JToken实例。
但这里有个关键规则:显式转换运算符是编译时绑定的。
- 当你写
(JToken)mystring且mystring是明确的string类型时,编译器能识别到JToken有针对string的转换逻辑,会自动调用这个运算符完成转换,所以不会报错。 - 但当你把字符串存在
object变量里,编译器只知道变量是object类型,它不会去预判运行时的实际类型,只会尝试最基础的类型强制转换——可string根本不是JToken的子类,也没有针对object的转换运算符,自然就抛出InvalidCastException了。
为什么DynamicInvoke场景也触发异常?
Delegate.DynamicInvoke()的返回值固定是object类型,和上面的情况完全一致:编译器只能看到object类型,无法触发针对具体返回类型的显式转换运算符,直接强转(JToken)必然失败。
适配你场景的解决方案
既然你无法控制委托的返回类型,最通用且靠谱的办法是使用JToken.FromObject()方法——它会在运行时检查对象的实际类型,自动调用对应的序列化逻辑把对象转成JToken,完美适配所有你能保证“可转换为JToken”的类型。
修改你的apply_function方法即可:
public static JToken apply_function(Delegate function, object[] arglist) { var result = function.DynamicInvoke(arglist); return JToken.FromObject(result); }
这个方法不仅能处理字符串,还能兼容数字、自定义对象等所有Newtonsoft.Json支持序列化的类型,完全满足你的需求。如果你只是单独处理object转JToken的场景,直接用JToken.FromObject(myObject)也能解决第一个例子的问题。
内容的提问来源于stack exchange,提问作者Maarten Derickx
相关产品推荐
相关产品推荐

