C# 将XML元素反序列化为对象时,该元素可能是许多可能的元素之一

C# 将XML元素反序列化为对象时,该元素可能是许多可能的元素之一,c#,xml,xml-serialization,casting,xmlreader,C#,Xml,Xml Serialization,Casting,Xmlreader,在通过pub/sub以XML传输消息的本地框架中,我需要能够使用大量消息,但是,所有消息都作为简单文本接收,并且必须反序列化为Xsd工具创建的对象 消息本身都是从基本MessageType元素/对象派生的,但如果我基于该元素/对象进行反序列化,则如下所示: XmlSerializer serializer=新的XmlSerializer(typeof(MessageType)); XmlReader=XmlReader.Create(新建StringReader(rawMessage)); Me

在通过pub/sub以XML传输消息的本地框架中,我需要能够使用大量消息,但是,所有消息都作为简单文本接收,并且必须反序列化为Xsd工具创建的对象

消息本身都是从基本MessageType元素/对象派生的,但如果我基于该元素/对象进行反序列化,则如下所示:

XmlSerializer serializer=新的XmlSerializer(typeof(MessageType)); XmlReader=XmlReader.Create(新建StringReader(rawMessage)); MessageType消息=(MessageType)序列化程序。反序列化(读取器)

我收到一个错误,它说实际的元素类型(“UpdateParameter”say)不是预期的

目前我能想到的唯一解决方案是使用switch语句:

XmlReader=XmlReader.Create(新建StringReader(upString)); reader.MoveToContent(); 开关(reader.LocalName.ToLower()) { 案例“updateparameter”: serializer=新的XmlSerializer(typeof(UpdateParameter)); doStuff((UpdateParameter)序列化程序。反序列化(xml)); 打破 案例“updateparameterresponse”: serializer=新的XmlSerializer(typeof(UpdateParameterResponse)); doStuff((UpdateParameterResponse)序列化程序。反序列化(xml)); 打破 案例“UpdateStatusResponse”: serializer=新的XmlSerializer(typeof(UpdateStatusResponse)); doStuff((UpdateStatusResponse)序列化程序。反序列化(xml)); 打破 //…等。对所有可能的元素重复 }

但如果有一个简单的解决办法,我真的不想这么做。我想做的是

Type rootType = Type.GetType(reader.localName);// could work if name is right serializer = new XmlSerializer(typeof(rootType)); // would work doStuff((rootType)serializer.Deserialize(xml)); // won't work Type rootType=Type.GetType(reader.localName);//如果名字对的话可能会有用 serializer=新的XmlSerializer(typeof(rootType));//行得通 doStuff((rootType)序列化程序。反序列化(xml));//行不通 但正如注释所指出的,它至少不起作用,因为您似乎无法使用类型变量进行转换。此外,尽管xml元素的localName与对象的本地名匹配,但上述方法需要(据我所知)程序集限定名,这是另一个beast。请注意,理想情况会使doStuff方法过载


有没有一个优雅的解决方案,我错过了?或者至少一个解决方案不涉及无止境的开关语句?

所讨论的相同问题


您能发布一段XML文件格式的片段吗?谢谢!我在找的时候没看到那个。 XmlReader reader = XmlReader.Create(new StringReader(upString)); reader.MoveToContent(); switch (reader.LocalName.ToLower()) { case "updateparameter": serializer = new XmlSerializer(typeof(UpdateParameter)); doStuff((UpdateParameter)serializer.Deserialize(xml)); break; case "updateparameterresponse": serializer = new XmlSerializer(typeof(UpdateParameterResponse)); doStuff((UpdateParameterResponse)serializer.Deserialize(xml)); break; case "UpdateStatusResponse": serializer = new XmlSerializer(typeof(UpdateStatusResponse)); doStuff((UpdateStatusResponse)serializer.Deserialize(xml)); break; //...etc. Repeat for all possible elements } Type rootType = Type.GetType(reader.localName);// could work if name is right serializer = new XmlSerializer(typeof(rootType)); // would work doStuff((rootType)serializer.Deserialize(xml)); // won't work