C# 如何使用接受XDocument的构造函数将XML反序列化为对象?

C# 如何使用接受XDocument的构造函数将XML反序列化为对象?,c#,.net,xml,xml-serialization,linq-to-xml,C#,.net,Xml,Xml Serialization,Linq To Xml,我有一门课: public class MyClass { public MyClass(){} } 我希望能够使用XMLSeralizer直接在构造函数中反序列化XDocument,因此: public class MyClass { private XmlSerializer _s = new XmlSerializer(typeof(MyClass)); public MyClass(){} public MyClass(XDocument xd) {

我有一门课:

public class MyClass
{
   public MyClass(){}
}
我希望能够使用XMLSeralizer直接在构造函数中反序列化XDocument,因此:

public class MyClass
{
   private XmlSerializer _s = new XmlSerializer(typeof(MyClass));

   public MyClass(){}
   public MyClass(XDocument xd)
   {
      this = (MyClass)_s.Deserialize(xd.CreateReader());
   }
}
除非我不允许在构造函数中指定“this”


这可能吗?不,不可能。序列化程序在反序列化时创建对象。您已经创建了一个对象。相反,提供一个从XDocument构造的静态方法

public static MyClass FromXml (XDocument xd)
{
   XmlSerializer s = new XmlSerializer(typeof(MyClass));
   return (MyClass)s.Deserialize(xd.CreateReader());
}

使用静载荷法更为标准

public class MyClass
{
    public static MyClass Load(XDocument xDoc)
    {
        XmlSerializer _s = new XmlSerializer(typeof(MyClass));
        return (MyClass)_s.Deserialize(xDoc.CreateReader());
    }
}

最好使用某种工厂,例如:

public static MyClass Create(XDocument xd)
{
    XmlSerializer _s = new XmlSerializer(typeof(MyClass));
    return (MyClass)_s.Deserialize(xd.CreateReader());
}

我也想做同样的事情,并决定做以下事情:

public class MyClass
{
   public MyClass(){
   }

   public MyClass(XDocument xd)
   {
      var t = typeof(MyClass);
      var o = (MyClass)new XmlSerializer(t).Deserialize(xd.CreateReader());

      foreach (var property in t.GetProperties())
          property.SetValue(this, property.GetValue(o));
   }
}

你为什么要这样做?因为实例化这个类并给它提供一个XDocument并让它自己像那样设置会很好。还有其他的解决方案,但对我来说这似乎是最优雅的。。。我愿意接受更好的建议。难道你不能将类设置为将数据序列化到其中,从而为你创建实例吗?当外部类型(knownTypes)在编译时未知时,你应该怎么做?这太糟糕了,在开始反序列化之前,我们甚至没有对init进行预回调?