我有一个方法可以返回一个汽车列表(IEnumerable)..
(适用于返回类型 IEnumerable<Car>
和 List<Car>
):
public IEnumerable<Car> GetCars(string xml)
{
var myResultList;
XElement doc = XElement.Parse(xml);
myResultList = doc.Descendants().Descendants("dict").Select(
x => new Employee
{
Id = x.Elements("string").ElementAt(0).Value,
Prename = x.Elements("string").ElementAt(1).Value,
Name = x.Elements("string").ElementAt(2).Value,
Initials = x.Elements("string").ElementAt(3).Value
}
);
IEnumerable<Car> enumerable = myResultList;
return enumerable;
//---
//or as a List if it's better?
List<Car> asList = enumerable.ToList();
//then: return 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
}
我希望我的问题够清楚了.. 想象一下你会有一个像 House 而不是 Car 的其他类型,但你想对每种类型使用相同的方法.
我怎样才能做到这一点?帮助将不胜感激。
编辑:
添加了填充“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>
和
<plist version="1.0">
<dict>
<key>DataType</key>
<string>Agent</string>
<key>7000</key>
<dict>
<key>AgentNo</key>
<string>7000</string>
<key>Initialien</key>
<string>VW</string>
<key>Namen</key>
<string>Walter Gnos Vertretungen Vevey</string>
</dict>
<key>7001</key>
<dict>
<key>AgentNo</key>
<string>7001</string>
<key>Namen</key>
<string>Miller GmbH Bern</string>
</dict>
<key>7002</key>
<dict>
<key>AgentNo</key>
<string>7002</string>
<key>Initialien</key>
<string>MAL</string>
<key>Namen</key>
<string>Walter Lohner Stans</string>
</dict>
</dict>
</plist>
最佳答案
您唯一缺少的是 <T>
:
public IEnumerable<T> GetData<T>(string xml)
然后你称它为:
var data = obj.GetData<House>(xml);
哪里<House>
告诉GetData
什么T
是为了那个电话。注意里面GetData<T>
你可以使用 typeof(T)
得到Type
,如果您使用 XmlSerializer
,这可能是必需的或类似的反序列化。
请注意,在某些情况下,使用泛型真的很方便,而在其他一些情况下,它实际上会使事情变得有问题 - 所以您可能还想考虑是否它可能不适合使用:
public IEnumerable GetData(Type type, string xml)
即通过 Type
in 作为常规参数。如果你正在做大量的反射工作,这会很有用,泛型变得很棘手。但要强调:通用和非通用的解决方案都是合理有效的。
关于C# Return Generic List/IEnumerable,它是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12688816/