C#返回泛型列表/IEnumerable,它是如何工作的?
我有一个方法可以返回一个汽车列表(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
和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;
}
}
}