0

有什么方法可以控制此语句的格式?

var element = new XElement("Element", true);

这样我就可以得到这个输出,例如:

<Element>True</Element>

我正在寻找可插入的格式化程序,而不是类似的东西true ? "True": "False"

之后我尝试遍历元素,但似乎 XElement 的构造函数调用ToString()了该值,这意味着我很难评估类型。

4

1 回答 1

1

完全改版的答案:

以前我推荐过 XmlWriter,但事实证明这是不可能的。

我正在编辑这个答案,因为XElement没有像我想的那样保留类型,即

var x = new XElement("element", true);
x.WriteTo(new XmlTextWriter(Console.Out)); // Write stuff to console using XmlTextWriter

WriteValue(Boolean)永远不会被调用,该值存储XTextXElement.

对于感兴趣的人,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),本质上问题不是格式问题,而是创建问题。

于 2012-06-19T12:49:51.570 回答