C# 从xml继承/实现列表/ICollection/e.t.c反序列化类型

C# 从xml继承/实现列表/ICollection/e.t.c反序列化类型,c#,.net,xml,xml-deserialization,C#,.net,Xml,Xml Deserialization,我有这样的类层次结构,我想从XML反序列化这些类。此层次结构将通过“OrCondition:ConditionToWork”e.t.c.扩展,因此解决方案必须是可扩展的 public abstract class ConditionToWork { } [XmlType(nameof(WorkerMethodCondition))] public class WorkerMethodCondition : ConditionToWork { [XmlAttribute(nameof(W

我有这样的类层次结构,我想从XML反序列化这些类。此层次结构将通过“OrCondition:ConditionToWork”e.t.c.扩展,因此解决方案必须是可扩展的

public abstract class ConditionToWork { }

[XmlType(nameof(WorkerMethodCondition))]
public class WorkerMethodCondition : ConditionToWork
{
    [XmlAttribute(nameof(WorkerMethodName))]
    public string WorkerMethodName { get; set; };
}

[XmlType("And")]
public class AndCondition : List<ConditionToWork>{}
以及我要反序列化的XML:

...
<Worker>
  <Conditions>
    <WorkerMethodCondition/>
    <WorkerMethodCondition/>
    <WorkerMethodCondition/>
    <And>
      <WorkerMethodCondition/>
    </And>
  </Conditions>
</Worker>
...
如何正确反序列化“和”节点?

请尝试以下操作:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XmlReader reader = XmlReader.Create(FILENAME);
            XmlSerializer serializer = new XmlSerializer(typeof(Worker));
            Worker worker = (Worker)serializer.Deserialize(reader);
        }
    }
    public class Worker
    {
        public Conditions Conditions { get; set; }
    }
    public class Conditions
    {
        [XmlElement()]
        public List<string> WorkerMethodCondition { get; set; }
        public And And { get; set; }
    }
    public class And
    {
        public string WorkerMethodCondition { get; set; }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
使用System.Xml.Serialization;
命名空间控制台应用程序1
{
班级计划
{
常量字符串文件名=@“c:\temp\test.xml”;
静态void Main(字符串[]参数)
{
XmlReader=XmlReader.Create(文件名);
XmlSerializer serializer=新的XmlSerializer(typeof(Worker));
工作者=(工作者)序列化程序。反序列化(读取器);
}
}
公社工人
{
公共条件{get;set;}
}
公共阶级条件
{
[XmlElement()]
公共列表工作方法条件{get;set;}
公共和{get;set;}
}
公共类和
{
公共字符串WorkerMethodCondition{get;set;}
}
}
尝试以下操作:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XmlReader reader = XmlReader.Create(FILENAME);
            XmlSerializer serializer = new XmlSerializer(typeof(Worker));
            Worker worker = (Worker)serializer.Deserialize(reader);
        }
    }
    public class Worker
    {
        public Conditions Conditions { get; set; }
    }
    public class Conditions
    {
        [XmlElement()]
        public List<string> WorkerMethodCondition { get; set; }
        public And And { get; set; }
    }
    public class And
    {
        public string WorkerMethodCondition { get; set; }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
使用System.Xml.Serialization;
命名空间控制台应用程序1
{
班级计划
{
常量字符串文件名=@“c:\temp\test.xml”;
静态void Main(字符串[]参数)
{
XmlReader=XmlReader.Create(文件名);
XmlSerializer serializer=新的XmlSerializer(typeof(Worker));
工作者=(工作者)序列化程序。反序列化(读取器);
}
}
公社工人
{
公共条件{get;set;}
}
公共阶级条件
{
[XmlElement()]
公共列表工作方法条件{get;set;}
公共和{get;set;}
}
公共类和
{
公共字符串WorkerMethodCondition{get;set;}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XmlReader reader = XmlReader.Create(FILENAME);
            XmlSerializer serializer = new XmlSerializer(typeof(Worker));
            Worker worker = (Worker)serializer.Deserialize(reader);
        }
    }
    public class Worker
    {
        public Conditions Conditions { get; set; }
    }
    public class Conditions
    {
        [XmlElement()]
        public List<string> WorkerMethodCondition { get; set; }
        public And And { get; set; }
    }
    public class And
    {
        public string WorkerMethodCondition { get; set; }
    }
}