我有以下功能:
private string ParseJson(dynamic q)
{
string returnJSON = "[{ \"type\" : \"pie\", \"name\" : \"Campaigns\", \"data\" : [ ";
foreach (var grp in q)
{
double currCount = grp.Count();
if (grp.Key != null)
returnJSON += "['" + grp.Key + "', " + currCount + "],";
else
returnJSON += "['none', " + currCount + "],";
}
returnJSON = returnJSON.Substring(0, returnJSON.Length - 1);
returnJSON += "]}]";
return returnJSON;
}
我用这样的方法调用它:
public string GetCampaignData()
{
PaymentModelDataContext db = new PaymentModelDataContext();
var q = from Event in db.TrackingEvents
group Event by Event.campaignID;
return ParseJson(q);
}
我将q用于几个不同的查询,所有分组数据。
问题是运行时由于某种原因无法将类型绑定到q。这是动态的正确使用吗?有没有不同的方法来做到这一点?
答案 0 :(得分:4)
问题是Count()
是IEnumerable<T>
之外的扩展方法,因此无法从动态调用它(因为它不是类的真正方法)。
您的变量grp也是动态的,因为它是由动态变量q:
上的表达式产生的foreach (var grp in q)
由于我们不能从动态调用扩展方法(同样,它们不是类的真正成员),我们需要显式调用扩展方法而不是Enumerable
静态类。所以将代码更改为:
double currCount = Enumerable.Count(grp);
你会发现它适用于Count()
,如果你想要真正使用dynamic
。
那就是说,我同意@ John的评论,你应该考虑将其改为非动态的。实际上,你的方法接受的是IEnumerable&gt;像这样:
private string ParseJson<TKey,TValue>(IEnumerable<IGrouping<TKey,TValue>> q)
{
string returnJSON = "[{ \"type\" : \"pie\", \"name\" : \"Campaigns\", \"data\" : [ ";
foreach (var grp in q)
{
double currCount = grp.Count();
if (grp.Key != null)
returnJSON += "['" + grp.Key + "', " + currCount + "],";
else
returnJSON += "['none', " + currCount + "],";
}
returnJSON = returnJSON.Substring(0, returnJSON.Length - 1);
returnJSON += "]}]";
return returnJSON;
}
如果您愿意,也可以根据您的使用情况设置非泛型参数类型。但这适用于所有分组......