此代码改编自答案here,适用于Visual Studio 2013中的.NET 4.5.1应用程序:
private void button42_Click(object sender, EventArgs e)
{
List<SiteQuery> sitequeries = GetListOfSiteQueries();
foreach (SiteQuery sitequery in sitequeries)
{
// TODO: Insert into table
}
}
private List<SiteQuery> GetListOfSiteQueries()
{
ArrayList arrList =
FetchSiteQuery("http://localhost:21608/api/sitequery/getall/dbill/ppus/42");
String omnivore = "<SiteQueries>";
foreach (String s in arrList)
{
omnivore += s;
}
omnivore += "</SiteQueries>";
String unwantedPreamble = "<ArrayOfSiteQuery xmlns:i=\"http://www.w3.org/2001/XMLSchema-
instance\" xmlns=\"http://schemas.datacontract.org/2004/07/CStore.DomainModels.HHS\">";
omnivore = omnivore.Replace(unwantedPreamble, String.Empty);
omnivore = omnivore.Replace("</ArrayOfSiteQuery>", String.Empty);
XDocument xmlDoc = XDocument.Parse(omnivore);
List<SiteQuery> sitequeries =
xmlDoc.Descendants("SiteQuery").Select(GetSiteQueryForXMLElement).ToList();
return sitequeries;
}
private static SiteQuery GetSiteQueryForXMLElement(XElement sitequery)
{
return new SiteQuery
{
Id = sitequery.Element("Id").Value,
. . .
但是,VS 2008中的.NET 3.5,Compact Framework / Windows CE应用程序中的相同代码无法使用&#34; 编译方法的类型参数&System; Linin.Enumerable.Select (System.Collections.Generic.IEnumerable,System.Func)&#39;无法从使用中推断出来。尝试明确指定类型参数。&#34;
这条线失败了:
List<SiteQuery> sitequeries = xmlDoc.Descendants("SiteQuery").Select(GetSiteQueryForXMLElement).ToList();
为什么相同的代码在一个案例中起作用而在另一个案例中起作用;是因为顽固的代码Windows CE-ness和/或因为它是.NET 3.5而不是较新的4.5.1?
如果这些限制中的一个或两个是问题,是否有解决方法,或者它是否回到编码板&#34;情况?
答案 0 :(得分:4)
在VS2010(IIRC)中更改了类型推断 - 基本上编译器的功能稍微强一些。这不是.NET本身的变化问题。
两个简单的选择:
改为使用lambda表达式:
.Select(x => GetSiteQueryForXMLElement(x))
使用方法组转换指定类型参数:
.Select<XElement, SiteQuery>(GetSiteQueryForXMLElement);
要么工作正常。