有什么办法可以控制这个陈述的格式吗?
var element = new XElement("Element", true);
这样我就可以得到这个输出,例如:
<Element>True</Element>
我正在寻找一个可插拔的格式化程序,而不是true ? "True": "False"
我之后尝试过遍历元素,但似乎XElement的构造函数在值上调用ToString()
,这意味着我很难评估类型。
答案 0 :(得分:1)
完全改回答案:
以前我推荐过XmlWriter,但事实证明这是不可能的。
我正在编辑这个答案,因为XElement
没有像我想象的那样保留类型,即在
var x = new XElement("element", true);
x.WriteTo(new XmlTextWriter(Console.Out)); // Write stuff to console using XmlTextWriter
永远不会调用 WriteValue(Boolean)
,该值会在XText
中存储为XElement
。
对于那些感兴趣的人,XElement.WriteTo调用XmlWriter.WriteElement(一个扩展方法),后者又调用XmlWriter.WriteString。
可以更改XmlWriter.WriteString的行为,但这也会改变
的输出var x = new XElement("element", "true"); // String instead of bool
因为没有存储类型。
我的解决方案是创建一个工厂,并通过它控制XElements的创建方式。 IE:
class XElementFactory {
public static XElement CreateXElement(string name, object value) {
var type = obj.GetType();
if (typeof(boolean).Equals(type))
// Format the XText accordig to specification, use the XText ctor for clarification and readability
return new XElement(name, (bool) obj ? new XText("True") : XText("False"));
// Maybe add additional if clauses if there are just a few special cases
return new XElement(name, obj); // Let it through
}
}
反射严重损害了性能,但是由于我们处理XML,我的猜测是性能开始并不重要。如果需要,使用构建器模式,其中根据类型调用正确的构建器,即:
Builders.First(b => b.Types.Contains(objToBuild.GetType())).BuildXElement(objToBuild); // Builders could maybe be filled by MEF?
这个答案有点长(但我在长时间的电话会议中做了一些事情= P),实质上问题不是格式问题而是创作问题。