C# 反序列化在运行时之前未知的对象
我查看了堆栈溢出,了解到我计划实现的是不可能的,因为泛型在编译时是强类型的。然而,如果我能解释我想要的结果,希望有人能给我指出一条不同的道路 我有一个类型名和一些从数据库检索到的xml。为了简化本图,它们如下所示: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
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上)
- 我从数据库收到的信息
- 其他一切
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的帮助