C# 格式化元素值

C# 格式化元素值,c#,linq-to-xml,C#,Linq To Xml,有什么方法可以控制这个语句的格式吗 var element = new XElement("Element", true); 这样我就可以得到这个输出,例如: <Element>True</Element> True 我正在寻找一个可插入的格式化程序,而不是像true这样的东西?“真”:“假” 后来我尝试过遍历元素,但似乎XElement的构造函数调用了值上的ToString(),这意味着我很难评估类型。完全修改了答案: 以前我推荐XmlWriter,但事实证明这是

有什么方法可以控制这个语句的格式吗

var element = new XElement("Element", true);
这样我就可以得到这个输出,例如:

<Element>True</Element>
True
我正在寻找一个可插入的格式化程序,而不是像
true这样的东西?“真”:“假”


后来我尝试过遍历元素,但似乎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
因为没有存储类型

我的解决方案是创建一个工厂,并通过它控制元素的创建方式。即:

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),本质上,这个问题不是格式问题,而是创建问题。

我猜
新元素(“元素”,“真”)
在某种程度上并没有完全解决它?扩展方法不参与多态性,因此不可能用扩展方法重写。您是否控制XElements的生命周期?IE一个只重写ToString()的扩展类(ex MyXElement)能做到这一点吗?我正在考虑一些更通用的东西,以便
DateTime
和其他类型也可以格式化。我确实控制了XElement的创建,并尝试实现了一个衍生版本的
XElement
,在这个版本中,可以使用
父属性等在层次结构的任何级别添加格式化程序。在谷歌搜索之后,我找到了以下文档。这应该提供了一种灵活的xml格式设置方法,尽管在某些情况下有点过分。我特别想在
XElement
和friends中设置值的格式,所以
XmlWriter
类不是一个选项。@MikaelÖstberg我完全重写了答案,我在一次长时间的会议中做了一些研究。