如何使用带有XDocument的构造函数将XML反序列化为对象?

我上课了:

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)); } } 

你的问题的简单答案是否定的,你不能。 因此,原因是您在反序列化时创建了一个对象。

但是如果你真的坚持对象实例化自己的可能性,你可以使用私有静态实例变量,你可以用反序列化后得到的对象加载它。 然后其他公共成员应该在实例上工作(当它不是null时)

一个例子(从我的头脑中,所以有一点点机会它不完全正确):

 public class MyClass { private XmlSerializer _s = new XmlSerializer(typeof(MyClass)); private static MyClass mInstance = null; public MyClass() { /* initialization logic */ } public MyClass(XDocument xd) { mInstance = (MyClass)_s.Deserialize(xd.CreateReader()); } public void DoSomething() { if (mInstance != null) mInstance.DoSomething(); else { // logic for DoSomething } } } 

我希望这有点清楚,但我不喜欢这样的设计。 我认为这使得它过于复杂且对错误敏感。