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



不知道我在白话上的表现如何? 但我的问题是我有一个通过 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 可能是您更好的选择。

相关内容

  • 没有找到相关文章

最新更新