C# 列表<;T>;对XML字符串扩展方法的修改

C# 列表<;T>;对XML字符串扩展方法的修改,c#,xml,list,csv,extension-methods,C#,Xml,List,Csv,Extension Methods,如何创建一个扩展方法来将T列表转换为XML字符串。 其中,我的T对象的属性成为xml标记,属性的值成为xml标记中的值。我的T对象具有简单的字符串属性,即没有集合或二维对象。也就是说,所有属性都是string、int等,即一维。没有列表/数组作为属性 例如,如果要转换此类列表: List<int> Branches = new List<int>(); Branches.Add(1); Branches.Add(2); Branches.Add(3); 例如,如果要转换

如何创建一个扩展方法来将T列表转换为XML字符串。
其中,我的T对象的属性成为xml标记,属性的值成为xml标记中的值。我的T对象具有简单的字符串属性,即没有集合或二维对象。也就是说,所有属性都是string、int等,即一维。没有列表/数组作为属性

例如,如果要转换此类列表:

List<int> Branches = new List<int>();
Branches.Add(1);
Branches.Add(2);
Branches.Add(3);

例如,如果要转换此类列表:

List<int> Branches = new List<int>();
Branches.Add(1);
Branches.Add(2);
Branches.Add(3);

创建扩展方法与常规方法没有太大区别。如果使用关键字“this”指定第一个参数(方法将扩展的对象),只需将方法设置为静态。剩下的只是计划的反思

    public static string GetXML<T>(this List<T> src)
    {
        // First, we have to determine the "Type" of the generic parameter.
        Type srcType = src.GetType();
        Type[] srcTypeGenArgs = srcType.GetGenericArguments();
        if (srcTypeGenArgs.Length != 1)
            throw new Exception("Only designed to work on classes with a single generic param.");
        Type genType = srcTypeGenArgs[0];

        // Get the properties for the generic Type "T".
        System.Reflection.PropertyInfo[] typeProps = genType.GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.GetProperty);

        // Now, we loop through each item in the list and extract the property values.
        StringBuilder sb = new StringBuilder();
        sb.AppendLine("<root>");
        for (int i = 0; i < src.Count; i++)
        {
            T listItem = src[i];
            for (int t = 0; t < typeProps.Length; t++)
            {
                object propVal = typeProps[t].GetValue(listItem, null); // Always pass "null" for the index param, if we're not dealing with some indexed type (like an array).
                string propValStr = (propVal != null ? propVal.ToString() : string.Empty);
                sb.AppendLine(string.Format("<{0}>{1}</{0}>", typeProps[t].Name, propValStr));
            }
        }
        sb.AppendLine("</root>");
        return sb.ToString();
    }
公共静态字符串GetXML(此列表src)
{
//首先,我们必须确定泛型参数的“类型”。
类型srcType=src.GetType();
Type[]srctypegenergs=srcType.GetGenericArguments();
if(srctypegenergs.Length!=1)
抛出新异常(“仅设计用于使用单个泛型参数的类”);
类型genType=srctypegenergs[0];
//获取泛型类型“T”的属性。
System.Reflection.PropertyInfo[]typeProps=genType.GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.GetProperty);
//现在,我们循环遍历列表中的每个项目并提取属性值。
StringBuilder sb=新的StringBuilder();
某人加上一行(“”);
对于(int i=0;i
创建扩展方法与常规方法没有太大区别。如果使用关键字“this”指定第一个参数(方法将扩展的对象),只需将方法设置为静态。剩下的只是计划的反思

    public static string GetXML<T>(this List<T> src)
    {
        // First, we have to determine the "Type" of the generic parameter.
        Type srcType = src.GetType();
        Type[] srcTypeGenArgs = srcType.GetGenericArguments();
        if (srcTypeGenArgs.Length != 1)
            throw new Exception("Only designed to work on classes with a single generic param.");
        Type genType = srcTypeGenArgs[0];

        // Get the properties for the generic Type "T".
        System.Reflection.PropertyInfo[] typeProps = genType.GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.GetProperty);

        // Now, we loop through each item in the list and extract the property values.
        StringBuilder sb = new StringBuilder();
        sb.AppendLine("<root>");
        for (int i = 0; i < src.Count; i++)
        {
            T listItem = src[i];
            for (int t = 0; t < typeProps.Length; t++)
            {
                object propVal = typeProps[t].GetValue(listItem, null); // Always pass "null" for the index param, if we're not dealing with some indexed type (like an array).
                string propValStr = (propVal != null ? propVal.ToString() : string.Empty);
                sb.AppendLine(string.Format("<{0}>{1}</{0}>", typeProps[t].Name, propValStr));
            }
        }
        sb.AppendLine("</root>");
        return sb.ToString();
    }
公共静态字符串GetXML(此列表src)
{
//首先,我们必须确定泛型参数的“类型”。
类型srcType=src.GetType();
Type[]srctypegenergs=srcType.GetGenericArguments();
if(srctypegenergs.Length!=1)
抛出新异常(“仅设计用于使用单个泛型参数的类”);
类型genType=srctypegenergs[0];
//获取泛型类型“T”的属性。
System.Reflection.PropertyInfo[]typeProps=genType.GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.GetProperty);
//现在,我们循环遍历列表中的每个项目并提取属性值。
StringBuilder sb=新的StringBuilder();
某人加上一行(“”);
对于(int i=0;i
您所说的大致可以理解为“序列化”,与大多数一般问题一样,这一问题也得到了解决。该框架当然为您提供了一些Xml序列化工具

给定一个类:

public class TestClass
{
    public string Prop1 {get;set;}
    public string Prop2 {get;set; }
}
以及一种扩展方法:

public static class SerializationExtensions
{
    public static string ToXml<T>(this List<T> list)
    {
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<T>)); 

        StringWriter stringWriter = new StringWriter(); 
        XmlTextWriter xmlWriter = new XmlTextWriter(stringWriter); 

        xmlWriter.Formatting = Formatting.Indented; 
        xmlSerializer.Serialize(xmlWriter, list); 

        return stringWriter.ToString();     
    }
}
公共静态类序列化扩展
{
公共静态字符串ToXml(此列表)
{
XmlSerializer XmlSerializer=新的XmlSerializer(typeof(List));
StringWriter StringWriter=新StringWriter();
XmlTextWriter xmlWriter=新的XmlTextWriter(stringWriter);
xmlWriter.Formatting=Formatting.Indented;
serializer.Serialize(xmlWriter,list);
返回stringWriter.ToString();
}
}
一个简单的演示生成xml

<?xml version="1.0" encoding="utf-16"?>
<ArrayOfTestClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <TestClass>
    <Prop1>val1</Prop1>
    <Prop2>val2</Prop2>
  </TestClass>
  <TestClass>
    <Prop1>val1</Prop1>
    <Prop2>val2</Prop2>
  </TestClass>
  <TestClass>
    <Prop1>val1</Prop1>
    <Prop2>val2</Prop2>
  </TestClass>
</ArrayOfTestClass>


您所说的大致可以理解为“序列化”,与大多数一般问题一样,这一问题也得到了解决。该框架当然为您提供了一些Xml序列化工具

给定一个类:

public class TestClass
{
    public string Prop1 {get;set;}
    public string Prop2 {get;set; }
}
以及一种扩展方法:

public static class SerializationExtensions
{
    public static string ToXml<T>(this List<T> list)
    {
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<T>)); 

        StringWriter stringWriter = new StringWriter(); 
        XmlTextWriter xmlWriter = new XmlTextWriter(stringWriter); 

        xmlWriter.Formatting = Formatting.Indented; 
        xmlSerializer.Serialize(xmlWriter, list); 

        return stringWriter.ToString();     
    }
}
公共静态类序列化扩展
{
公共静态字符串ToXml(此列表)
{
XmlSerializer XmlSerializer=新的XmlSerializer(typeof(List));
StringWriter StringWriter=新StringWriter();
XmlTextWriter xmlWriter=新的XmlTextWriter(stringWriter);
xmlWriter.Formatting=Formatting.Indented;
serializer.Serialize(xmlWriter,list);
返回stringWriter.ToString();
}
}
一个简单的演示生成xml

<?xml version="1.0" encoding="utf-16"?>
<ArrayOfTestClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <TestClass>
    <Prop1>val1</Prop1>
    <Prop2>val2</Prop2>
  </TestClass>
  <TestClass>
    <Prop1>val1</Prop1>
    <Prop2>val2</Prop2>
  </TestClass>
  <TestClass>
    <Prop1>val1</Prop1>
    <Prop2>val2</Prop2>
  </TestClass>
</ArrayOfTestClass>


创建XML片段,而不是file@stuartd-
XElement.Save(string fileName)
将负责创建文件。如果我不想使用属性,但使用元素,选项?@JeffJaffery也许你可以检查一下@VERYNET的工作效果。谢谢大家的回答。这将创建一个XML片段,而不是一个file@stuartd-
XElement.Save(string fileName)
将负责创建文件。如果我不想使用属性,但使用元素,选项?@JeffJaffery也许你可以检查一下@VERYNET的工作效果。