【问题标题】:Extension Method for serializing an IEnumerable<T> object to a string array?将 IEnumerable<T> 对象序列化为字符串数组的扩展方法?
【发布时间】:2009-07-16 16:08:33
【问题描述】:

My last question was about getting the string representation of an object serialized to XML。其中一位响应者编写了一个扩展方法来封装序列化过程。

我现在的问题是,当传递IEnumerable&lt;T&gt; 对象时,我如何使用扩展方法返回字符串数组,其中数组中的每个string 都将是IEnumerable&lt;T&gt; 的单独序列化元素。

提前致谢!

【问题讨论】:

    标签: c# xml-serialization


    【解决方案1】:

    回答您接下来的几个问题...

    new XElement("people", myPeople.ToXElements());
    

    public static class XmlTools
    {
        public static XElement ToXElement<T>(this T input)
        {
            return XElement.Parse(input.ToXmlString());
        }
        public static IEnumerable<XElement> ToXElements<T>(this IEnumerable<T> input)
        {
            foreach (var item in input)
                yield return input.ToXElement();
        }
        public static IEnumerable<string> ToXmlString<T>(this IEnumerable<T> input)
        {
            foreach (var item in input)
                yield return item.ToXmlString();
        }
        public static string ToXmlString<T>(this T input)
        {
            using (var writer = new StringWriter())
            {
                input.ToXml(writer);
                return writer.ToString();
            }
        }
        public static void ToXml<T>(this T objectToSerialize, Stream stream)
        {
            new XmlSerializer(typeof(T)).Serialize(stream, objectToSerialize);
        }
    
        public static void ToXml<T>(this T objectToSerialize, StringWriter writer)
        {
            new XmlSerializer(typeof(T)).Serialize(writer, objectToSerialize);
        }
    }
    

    【讨论】:

      【解决方案2】:

      使用链接中的代码示例,您可以添加另一个类似这样的方法或使用 ToArray() 方法将它们转换为数组。

      public static class XmlTools
      {
        public static IEnumerable<string> ToXmlString<T>(this IEnumerable<T> inputs)
        {
           return inputs.Select(pArg => pArg.ToXmlString());
        }
      }
      

      【讨论】:

      • 可能感兴趣:研究语言 Cω(Linq 的一些想法首先被原型化)自动定义了您的示例方法。 IEnumerable&lt;T&gt; 将有效地拥有与T 的方法同名的方法,除了返回类型R 将变为IEnumerable&lt;R&gt;。就像Select 以非常简洁的方式内置到语言中一样。
      【解决方案3】:

      我会编写我的扩展方法来生成一个新的 IEnumerable 而不是一个数组:

      public static IEnumerable<string> XmlSerializeAll<T>(this IEnumerable<T> input)
      {
          foreach (T item in input)
          {
              yield return item.ToXmlString();
          }
      }
      

      你可以通过使用轻松得到你想要的数组

      var myArray = myEnumerable.XmlSerializeAll().ToArray();
      

      这样,您增加了一些灵活性。如果您愿意,可以生成一个列表,或者使用无限长的枚举:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-30
        • 2011-07-28
        • 2014-11-08
        • 1970-01-01
        • 2018-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多