C# 如何将列表转换为XML字符串

C# 如何将列表转换为XML字符串,c#,xml,telerik,expandoobject,dynamicobject,C#,Xml,Telerik,Expandoobject,Dynamicobject,我想使用ExpandoObjects列表作为Telerik报告的数据源,但Telerik报告目前似乎不支持这一点。它们确实支持使用XML作为数据源,因此我尝试将ExpandoObjects列表转换为XML字符串 我已经看到,单个ExpandooObject可以通过以下VB.net代码而不是c通过jsonFx序列化为XML字符串: dim XMLwriter As New JsonFx.Xml.XmlWriter dim serializedExpando as string = XMLwrite

我想使用ExpandoObjects列表作为Telerik报告的数据源,但Telerik报告目前似乎不支持这一点。它们确实支持使用XML作为数据源,因此我尝试将ExpandoObjects列表转换为XML字符串

我已经看到,单个ExpandooObject可以通过以下VB.net代码而不是c通过jsonFx序列化为XML字符串:

dim XMLwriter As New JsonFx.Xml.XmlWriter
dim serializedExpando as string = XMLwriter.Write(obj)
或其等效的c代码:

JsonFx.Xml.XmlWriter XMLwriter = new JsonFx.Xml.XmlWriter();
String serializedExpando  = XMLwriter.Write(obj);

如何将整个列表序列化为XML字符串

您可以先将ExpandooObject转换为IDictionary,然后使用DataContractSerializer进行序列化:

void Main()
{
    dynamic firstExpando = new ExpandoObject();
    firstExpando.Name = "Name";
    firstExpando.Age = 1;

    dynamic secondExpando = new ExpandoObject();
    secondExpando.Name = "SecondName";
    secondExpando.Age = 2;

    var expandoList = new List<ExpandoObject> {firstExpando, secondExpando};

    var list = expandoList.Select(expando => (IDictionary<string, object>)expando)
                          .ToList();

    var dataContractSerializer = new DataContractSerializer(list.GetType());
    using (MemoryStream memoryStream = new MemoryStream())
    {
        dataContractSerializer.WriteObject(memoryStream, list);
        string outputXml = Encoding.UTF8.GetString(memoryStream.ToArray())
    }
}

通过先将ExpandooObject转换为IDictionary,然后使用DataContractSerializer进行序列化,可以对其进行序列化:

void Main()
{
    dynamic firstExpando = new ExpandoObject();
    firstExpando.Name = "Name";
    firstExpando.Age = 1;

    dynamic secondExpando = new ExpandoObject();
    secondExpando.Name = "SecondName";
    secondExpando.Age = 2;

    var expandoList = new List<ExpandoObject> {firstExpando, secondExpando};

    var list = expandoList.Select(expando => (IDictionary<string, object>)expando)
                          .ToList();

    var dataContractSerializer = new DataContractSerializer(list.GetType());
    using (MemoryStream memoryStream = new MemoryStream())
    {
        dataContractSerializer.WriteObject(memoryStream, list);
        string outputXml = Encoding.UTF8.GetString(memoryStream.ToArray())
    }
}

谢谢虽然从ExpandoObject生成的XML在一般情况下似乎不是特别有用,无论是从您的代码还是其他人的代码中,因为它序列化了用于保存属性字段名称和值的底层字典,但这似乎确实可行。为了将此动态数据用作Telerik报告的数据源,我发现最好将ExpandoObjects列表转换为DataTable,或者绕过expando对象直接转到DataTable并将其用作数据源。谢谢。虽然从ExpandoObject生成的XML在一般情况下似乎不是特别有用,无论是从您的代码还是其他人的代码中,因为它序列化了用于保存属性字段名称和值的底层字典,但这似乎确实可行。为了将此动态数据用作Telerik报告的数据源,我发现最好将ExpandoObjects列表转换为DataTable,或者绕过expando对象直接转到DataTable并将其用作数据源。