将动态值转换为从使用.GetType()检索的类型的字符串表示派生的特定类型

时间:2016-03-17 18:15:42

标签: c# json.net

不确定我是怎么做的?但我的问题是我有一个通过Json.net序列化的动态属性。由于我不打算进入的原因,Json.net的内置类型处理将不会到期。现在我的属性存储在Json中也是该类型的字符串表示形式,例如对于int的System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089。如何使用它将动态类型转换为指定的类型?

1 个答案:

答案 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对你来说可能是更好的选择。