有什么方法可以控制此语句的格式?
var element = new XElement("Element", true);
这样我就可以得到这个输出,例如:
<Element>True</Element>
我正在寻找可插入的格式化程序,而不是类似的东西true ? "True": "False"
之后我尝试遍历元素,但似乎 XElement 的构造函数调用ToString()
了该值,这意味着我很难评估类型。
有什么方法可以控制此语句的格式?
var element = new XElement("Element", true);
这样我就可以得到这个输出,例如:
<Element>True</Element>
我正在寻找可插入的格式化程序,而不是类似的东西true ? "True": "False"
之后我尝试遍历元素,但似乎 XElement 的构造函数调用ToString()
了该值,这意味着我很难评估类型。
完全改版的答案:
以前我推荐过 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),本质上问题不是格式问题,而是创建问题。