比方说,我的数据库中有一个表,它将对象的Type存储为字符串,将对象的序列化数据存储为JSON。这张桌子可以放很多不同的物体。
我想根据存储的类型重新创建对象,比如这样:
string typeFromDatabase = "SomeType";
string serializedData = ...some Json data here...;
var typeToCast = ...some reflection methods here...;
var myDeserializedObject = JsonConvert.DeserializeObject<typeToCast>(serializedData);
这样的事情可能发生吗?
提前谢谢。
编辑:
我想我被误解了——我知道,我可以用这样的东西:
var x = JsonConvert.DeserializeObject(sr1, typeof(SerizlizationTest1));
但在上面的例子中,"x"仍然被识别为"Object",而不是"SerizlizationTest1"——这正是我真正想要的。
现在,我想起来……我想这是不可能的,而且非常无用;]我想这就是"动态"对象的作用。
不管怎样,还是谢谢你,很抱歉问了这个没用的问题。
致以最良好的问候。
使用此过载,
var yourObject = JsonConvert.DeserializeObject(
serializedData,
Type.GetType(typeFromDatabase));
但是,只有当类型名称是程序集限定的时,这才会起作用。请参见此处。
如果类型名称不是程序集限定的,则存在其他问题。您必须执行类似于遍历所有加载的程序集以查找匹配项的操作。如果找不到匹配项或多个匹配项,该怎么办?
编辑后,您似乎在问,我如何转换为字符串中命名的类型。好吧,我相信这是可能的反射,但是,它不会帮助你写任何有用的代码。
如果你想访问对象上的某个东西,你需要根据类型字符串"知道"它的类型,一旦知道了,你就可以转换为该类型。事实上,您可能会在一开始就更好地使用DeserializeObject
的另一个过载。
您可以使用dynamic
盲目地插入对象,尝试您想要做的所有可能的组合,并捕捉失败,但这似乎是不必要和低效的。
试试下面的代码,它应该对你有用。
使用System。网状物剧本序列化;JavaScriptSerializer oJS=新的JavaScriptSerialier();RootObject oRootObject=新的RootObject();oRootObject=oJS。反序列化(您的JSon字符串);
是的,当然有可能,只需使用另一个重载:
var myDeserizlizedObject = JsonConvert.DeserizlizeObject(serizlizedData, typeToCast);
要检索类型,不需要一些"反射方法",请使用简单的
var typeToCast = Type.GetType(typeFromDatabase);
请确保名称是像Namespace.ClassName
一样的完整类型名称。
关于你最近的更新。有了特定的类型(我指的是新对象的进一步使用),你怎么可能从中受益呢?在像C#这样的强类型语言中,它确实看起来很荒谬:
// lets assume that var is magically becomes your typeToCast type
var myDeserizlizedObject = JsonConvert.DeserizlizeObject<typeToCast>(serizlizedData);
// imagine myDeserizlizedObject is a Car
myDeserizlizedObject.StartupEngine();
myDeserizlizedObject.Move();
// but what if it's a Bag ?
// the above code makes no sense then
要么它们有一个共同的父级,您可以通过强制转换以统一的方式处理它们,要么它是一个switch
,您可以按类型单独处理它们。