好的,我一直在研究这个。这是我想出的:
// use this instead of a bool, and it will serialize to "yes" or "no"
// minimal example, not very robust
public struct YesNo : IXmlSerializable {
// we're just wrapping a bool
private bool Value;
// allow implicit casts to/from bool
public static implicit operator bool(YesNo yn) {
return yn.Value;
}
public static implicit operator YesNo(bool b) {
return new YesNo() {Value = b};
}
// implement IXmlSerializable
public XmlSchema GetSchema() { return null; }
public void ReadXml(XmlReader reader) {
Value = (reader.ReadElementContentAsString() == "yes");
}
public void WriteXml(XmlWriter writer) {
writer.WriteString((Value) ? "yes" : "no");
}
}
然后我将我的 Foo 类更改为:
[XmlRoot()]
public class Foo {
public YesNo Bar { get; set; }
}
请注意,因为YesNo
是隐式可转换为bool
(反之亦然),您仍然可以这样做:
Foo foo = new Foo() { Bar = true; };
if ( foo.Bar ) {
// ... etc
换句话说,您可以将其视为布尔值。
和w00t!它序列化为:
<Foo><Bar>yes</Bar></Foo>
它还可以正确反序列化。
可能有某种方法可以让我的 XmlSerializer 自动将bool
它遇到的任何 s 转换为YesNo
s - 但我还没有找到它。任何人?