不知道我在白话上的表现如何? 但我的问题是我有一个通过 Json.net 序列化的动态属性。由于我不会讨论的原因,Json.net 的内置类型处理不会到期。现在我的属性存储在 Json 中也是该类型的字符串表示形式,例如 System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
用于 int。如何使用它将动态类型转换为指定类型?
这取决于您想要获得的范围。有几种选择。
选项 1:
如果已知可能类型的数量并且不太广泛,那么一个简单的方法如下:
使用类型字符串选择要通过 if/switch 转换为的类型
var typeString = "System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
var typeName = GetTypeName(typeString);
switch(typeName)
{
case "System.Int32":
//code to convert the dynamic representation into an int (e.g. Int32.TryParse(theTypeAsString) );
break;
case "System.Double":
//code to convert the dynamic representation into an double (e.g. Double.TryParse(theTypeAsString) );
break;
...
default:
throw new InvalidOperationException("The type provided is unknown.");
}
以上只是伪代码。但是你可以尝试类似的东西。
选项 2:
阅读您的评论后,一种更复杂的方法,但可能是您必须做的,是使用反射。
首先,您需要使用类型信息来执行运行时类型查找
,如下所示:var type = Type.GetType("System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
获得类型对象后,您现在拥有启动强制转换所需的信息。我假设你只需要投射,而不是反序列化。如果你只需要投射,那么你可能可以使用类似的东西
var destinationObject = Convert.ChangeType(dynamicProperty, type);
还可以使用该类型对象通过反射调用方法。
MethodInfo mi = type.GetMethod("SomeMethodBlah",
BindingFlags.Instance | BindingFlags.Public,
...);
mi.Invoke(...);
我认为选项 2 可能是您更好的选择。