Метод расширения для сериализации объекта IEnumerable <T>в массив строк? - PullRequest
2 голосов
/ 16 июля 2009

Мой последний вопрос был о получении строкового представления объекта, сериализованного в XML . Один из респондентов написал метод расширения для инкапсуляции процесса сериализации.

Мой вопрос теперь заключается в том, как я могу использовать метод расширения для возврата массива строк при передаче объекта IEnumerable<T>, где каждый string в массиве будет индивидуально сериализованным элементом IEnumerable<T>.

Заранее спасибо!

Ответы [ 3 ]

7 голосов
/ 16 июля 2009

Чтобы ответить на следующие несколько вопросов ...

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);
    }
}
5 голосов
/ 16 июля 2009

используя пример кода из вашей ссылки, вы можете добавить другой метод, подобный этому, или преобразовать их в массив, используя метод ToArray ().

public static class XmlTools
{
  public static IEnumerable<string> ToXmlString<T>(this IEnumerable<T> inputs)
  {
     return inputs.Select(pArg => pArg.ToXmlString());
  }
}
2 голосов
/ 16 июля 2009

Я бы написал свой метод расширения для создания нового 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();

Таким образом, вы добавляете некоторую гибкость. Вместо этого можно создать список или использовать бесконечно длинные перечисления, если вам нравится:)

...