C# 反序列化在运行时之前未知的对象

C# 反序列化在运行时之前未知的对象,c#,generics,deserialization,C#,Generics,Deserialization,我查看了堆栈溢出,了解到我计划实现的是不可能的,因为泛型在编译时是强类型的。然而,如果我能解释我想要的结果,希望有人能给我指出一条不同的道路 我有一个类型名和一些从数据库检索到的xml。为了简化本图,它们如下所示: string xml = @"<?xml version=\"1.0\"?><Car xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchem

我查看了堆栈溢出,了解到我计划实现的是不可能的,因为泛型在编译时是强类型的。然而,如果我能解释我想要的结果,希望有人能给我指出一条不同的道路

我有一个类型名和一些从数据库检索到的xml。为了简化本图,它们如下所示:

string xml = @"<?xml version=\"1.0\"?><Car xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">  <Name>Vauxhall</Name></Car>";
string classname = "Demo.Car";
stringxml=@“沃克斯霍尔”;
string classname=“Demo.Car”;
我最终想要做的是拥有一个car对象,这样我就可以将它传递给一个显示汽车的表单。但是,可以表示少量固定数量的对象

我知道我可能会有如下的想法,但我有一个模糊的希望,那就是有一个更优雅的解决方案:

switch(classname)
{
  case "Demo.Car":
    // deserialise into a car object and call method taking a car
    break;
  case "System.Collections.Generic.List<Demo.Car>":
    // deserialise into a list of car objects and call method taking a car
    break;
  case "Demo.Person":
    // deserialise into a car object and call method taking a car
    break;  
  //      and so on
}
开关(类名)
{
案例“Demo.Car”:
//反序列化为一个car对象并调用一个car方法
打破
案例“System.Collections.Generic.List”:
//反序列化到car对象列表中,并调用获取car的方法
打破
案例“Demo.Person”:
//反序列化为一个car对象并调用一个car方法
打破
//等等
}
我无法控制的事情:

  • Net版本(我在4.0上)
  • 我从数据库收到的信息
我能控制的

  • 其他一切
我知道人们会问我为什么要这样做。基本上,我们在消息总线上有几个主题的消息。有一个组件可以捕获从多个主题接收到的消息,并将有效负载保存到我前面提到的表中。这些消息不是持久性的(也不可能是持久性的),可以将其视为对任何侦听器的广播,而不是队列。加载用户界面时,我必须检索消息的历史记录

编辑1: 下面是我希望做的事情,但正如上面所解释的,我知道这是不可能的:

Type t = Type.GetType(classname);
var myCarObj = Serializer.FromXmlString<t>(xml); 
// Serializer is a utility class we have. it only wraps the System.Xml.Serialization
Type t=Type.GetType(classname);
var myCarObj=Serializer.FromXmlString(xml);
//序列化程序是我们拥有的一个实用程序类。它只包装System.Xml.Serialization

您可以使用字典将
类名
映射到相应的类型:

var map = new Dictionary<string, Type>
{
   { "Demo.Car", typeof(Car) },
   { "Demo.Person", typeof(Person) },
   ...
}

var serializer = new XmlSerializer(map[classname]);
using (var reader = new StringReader(xml))
{
   var result = serializer.Deserialize(reader);
   ...
}
var-map=新字典
{
{“Demo.Car”,类型(Car)},
{“Demo.Person”,typeof(Person)},
...
}
var serializer=新的XmlSerializer(映射[classname]);
使用(var reader=newstringreader(xml))
{
var result=序列化程序。反序列化(读取器);
...
}

在您的示例中,如何获得
“Demo.Car”
?这是表中的另一个字段吗?然后switch/case就是方法,或者
Dictionary
@Sinatr-是的,“Demo.Car”将来自表中的一个字段。显然你不能使用泛型。谢谢@Sinatr的帮助