C#返回泛型列表/IEnumerable,它是如何工作的?

C#返回泛型列表/IEnumerable,它是如何工作的?,c#,list,generics,ienumerable,C#,List,Generics,Ienumerable,我有一个方法可以返回一个汽车列表(IEnumerable) (适用于返回类型IEnumerable和List): public IEnumerable GetCars(字符串xml) { var-myResultList; XElement doc=XElement.Parse(xml); myResultList=doc.substands().substands(“dict”)。选择( x=>新员工 { Id=x.Elements(“字符串”).ElementAt(0).Value, Pre

我有一个方法可以返回一个汽车列表(IEnumerable)

(适用于返回类型
IEnumerable
List
):

public IEnumerable GetCars(字符串xml)
{
var-myResultList;
XElement doc=XElement.Parse(xml);
myResultList=doc.substands().substands(“dict”)。选择(
x=>新员工
{
Id=x.Elements(“字符串”).ElementAt(0).Value,
Prename=x.Elements(“字符串”).ElementAt(1).Value,
Name=x.Elements(“字符串”).ElementAt(2).Value,
缩写=x.Elements(“字符串”).ElementAt(3).Value
}
);
IEnumerable enumerable=myResultList;
返回可枚举;
//---
//或者作为一个列表,如果它更好?
List asList=enumerable.ToList();
//然后:返回asList
}
现在我想让这个方法成为通用的。 每个IEnumerable类型/或列表类型都应该能够

类似这样的东西——这只是伪代码,因为我不知道它是如何工作的

public IEnumerable<T> GetData(string xml)
{
    var myResultList;

    //...myResultList.. will be filled here (unnecessary) 

    IEnumerable<T> enumerable = myResultList;
    return enumerable;

    //---

    //or as a List if it's better?
    List<T> asList = enumerable.ToList();
    //then: return asList
}
public IEnumerable GetData(字符串xml)
{
var-myResultList;
//…myResultList..将在此处填写(不需要)
IEnumerable enumerable=myResultList;
返回可枚举;
//---
//或者作为一个列表,如果它更好?
List asList=enumerable.ToList();
//然后:返回asList
}
我希望我的问题足够清楚。。想象一下,你会有另一种类型,比如房子而不是汽车,但你想对每种类型使用相同的方法

我怎样才能做到这一点?我们将不胜感激

编辑:

添加了填充“myResultsList”的代码

编辑2: 2个XML应使用相同的方法:

 <plist version="1.0">
  <dict>
    <key>DataType</key>
    <string>Employee</string>
    <key>8000</key>
    <dict>
      <key>MitarbeiterNo</key>
      <string>8000</string>
      <key>Vorname</key>
      <string>Walter</string>
      <key>Name</key>
      <string>Walter Lohner Stans</string>
      <key>Initialien</key>
      <string>MAL</string>
    </dict>
    <key>8001</key>
    <dict>
      <key>MitarbeiterNo</key>
      <string>8001</string>
      <key>Vorname</key>
      <string>Motorrad</string>
      <key>Name</key>
      <string> Meierskappel</string>
      <key>Initialien</key>
      <string>MAM</string>
    </dict>
    <key>8004</key>
    <dict>
      <key>MitarbeiterNo</key>
      <string>8004</string>
      <key>Vorname</key>
      <string>Hanspeter</string>
      <key>Name</key>
      <string>Altenbürger AG  Horgen</string>
      <key>Initialien</key>
      <string>FH</string>
    </dict>
  </dict>
</plist>

数据类型
雇员
8000
米塔贝蒂尔诺
8000
沃名称
沃尔特
名称
沃尔特·洛纳·斯坦斯
初始值
马尔
8001
米塔贝蒂尔诺
8001
沃名称
宝马摩托车
名称
梅尔斯卡佩尔
初始值
妈妈
8004
米塔贝蒂尔诺
8004
沃名称
汉斯彼得
名称
阿尔滕布尔格银质激素
初始值
跳频


数据类型
代理人
7000
阿根诺
7000
初始值
大众汽车
纳明
沃尔特·格诺斯·维特伦根·维维
7001
阿根诺
7001
纳明
伯尔尼米勒股份有限公司
7002
阿根诺
7002
初始值
马尔
纳明
沃尔特·洛纳·斯坦斯

您唯一缺少的是


i、 e.将
类型作为常规参数传入。如果您在反射方面做了大量工作,并且泛型变得很棘手,那么这将非常有用。但要强调的是:通用和非通用解决方案都是合理有效的。

您唯一缺少的是


i、 e.将
类型作为常规参数传入。如果您在反射方面做了大量工作,并且泛型变得很棘手,那么这将非常有用。但要强调的是:通用和非通用解决方案都是合理和有效的。

下面是一个示例,说明您正在尝试做什么。您可以在控制台应用程序中粘贴此代码:

using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace Stackoverflow
{
    public class Foo
    {
        public int Id { get; set; }
        public Bar Bar { get; set; }
    }

    public class Bar { }

    class Program
    {
        private static void Main()
        {
            var foos = new List<Foo>
                           {
                               new Foo { Id =1, Bar = new Bar()},
                               new Foo { Id =2, Bar = null},
                               new Foo { Id =3, Bar = new Bar()},
                               new Foo { Id =4, Bar = null},
                           };

            var xml = ToXml(foos);

            var result = GetData<List<Foo>>(xml);
        }

        private static string ToXml(List<Foo> foos)
        {
            XmlSerializer ser = new XmlSerializer(foos.GetType());
            StringBuilder sb = new StringBuilder();
            StringWriter writer = new StringWriter(sb);
            ser.Serialize(writer, foos);

            string xml = sb.ToString();
            return xml;
        }

        public static T GetData<T>(string xml)
        {
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xml);

            XmlNodeReader reader = new XmlNodeReader(doc.DocumentElement);
            XmlSerializer ser = new XmlSerializer(typeof(T));
            object obj = ser.Deserialize(reader);

            T result = (T)obj;

            return result;
        }
    }
}
使用System.Collections.Generic;
使用System.IO;
使用系统文本;
使用System.Xml;
使用System.Xml.Serialization;
命名空间堆栈溢出
{
公开课Foo
{
公共int Id{get;set;}
公共条{get;set;}
}
公共类Bar{}
班级计划
{
私有静态void Main()
{
var foos=新列表
{
新Foo{Id=1,Bar=newbar()},
新的Foo{Id=2,Bar=null},
新Foo{Id=3,Bar=newbar()},
新的Foo{Id=4,Bar=null},
};
var xml=ToXml(foos);
var result=GetData(xml);
}
私有静态字符串ToXml(列出foos)
{
XmlSerializer ser=新的XmlSerializer(foos.GetType());
StringBuilder sb=新的StringBuilder();
StringWriter=新的StringWriter(sb);
serial.Serialize(writer,foos);
字符串xml=sb.ToString();
返回xml;
}
公共静态T GetData(字符串xml)
{
XmlDocument doc=新的XmlDocument();
doc.LoadXml(xml);
XmlNodeReader reader=新的XmlNodeReader(doc.DocumentElement);
XmlSerializer ser=新的XmlSerializer(typeof(T));
对象对象=序列反序列化(读取器);
T结果=(T)obj;
返回结果;
}
}
}

下面是一个您尝试执行的示例。您可以在控制台应用程序中粘贴此代码:

using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace Stackoverflow
{
    public class Foo
    {
        public int Id { get; set; }
        public Bar Bar { get; set; }
    }

    public class Bar { }

    class Program
    {
        private static void Main()
        {
            var foos = new List<Foo>
                           {
                               new Foo { Id =1, Bar = new Bar()},
                               new Foo { Id =2, Bar = null},
                               new Foo { Id =3, Bar = new Bar()},
                               new Foo { Id =4, Bar = null},
                           };

            var xml = ToXml(foos);

            var result = GetData<List<Foo>>(xml);
        }

        private static string ToXml(List<Foo> foos)
        {
            XmlSerializer ser = new XmlSerializer(foos.GetType());
            StringBuilder sb = new StringBuilder();
            StringWriter writer = new StringWriter(sb);
            ser.Serialize(writer, foos);

            string xml = sb.ToString();
            return xml;
        }

        public static T GetData<T>(string xml)
        {
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xml);

            XmlNodeReader reader = new XmlNodeReader(doc.DocumentElement);
            XmlSerializer ser = new XmlSerializer(typeof(T));
            object obj = ser.Deserialize(reader);

            T result = (T)obj;

            return result;
        }
    }
}
使用System.Collections.Generic;
使用System.IO;
使用系统文本;
使用System.Xml;
使用System.Xml.Serialization;
命名空间堆栈溢出
{
公开课Foo
{
公共int Id{get;set;}
公共条{get;set;}
}
公共类Bar{}
班级计划
{
私有静态void Main()
{
var foos=新列表
{
新Foo{Id=1,Bar=newbar()},
新的Foo{Id=2,Bar=null},
新Foo{Id=3,Bar=newbar()},
新的Foo{Id=4,Bar=null},
};
var xml=ToXml(foos);
var result=GetData(xml);
}
私有静态字符串ToXml(列出foos)
{
XmlSerializer ser=新的XmlSerializer(foos.GetType());
StringBuilder sb=新的StringBuilder();
StringWriter=新的StringWriter(sb);
serial.Serialize(writer,foos);
字符串xml=sb.ToString();
public IEnumerable<T> GetData<T>(string xml)
var data = obj.GetData<House>(xml);
public IEnumerable GetData(Type type, string xml)
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace Stackoverflow
{
    public class Foo
    {
        public int Id { get; set; }
        public Bar Bar { get; set; }
    }

    public class Bar { }

    class Program
    {
        private static void Main()
        {
            var foos = new List<Foo>
                           {
                               new Foo { Id =1, Bar = new Bar()},
                               new Foo { Id =2, Bar = null},
                               new Foo { Id =3, Bar = new Bar()},
                               new Foo { Id =4, Bar = null},
                           };

            var xml = ToXml(foos);

            var result = GetData<List<Foo>>(xml);
        }

        private static string ToXml(List<Foo> foos)
        {
            XmlSerializer ser = new XmlSerializer(foos.GetType());
            StringBuilder sb = new StringBuilder();
            StringWriter writer = new StringWriter(sb);
            ser.Serialize(writer, foos);

            string xml = sb.ToString();
            return xml;
        }

        public static T GetData<T>(string xml)
        {
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xml);

            XmlNodeReader reader = new XmlNodeReader(doc.DocumentElement);
            XmlSerializer ser = new XmlSerializer(typeof(T));
            object obj = ser.Deserialize(reader);

            T result = (T)obj;

            return result;
        }
    }
}