不确定我是怎么做的?但我的问题是我有一个通过Json.net序列化的动态属性。由于我不打算进入的原因,Json.net的内置类型处理将不会到期。现在我的属性存储在Json中也是该类型的字符串表示形式,例如对于int的System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
。如何使用它将动态类型转换为指定的类型?
答案 0 :(得分:3)
这取决于你想要的广泛程度。有几个选择。
选项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对你来说可能是更好的选择。