将动态数据类型传递给函数
本文关键字:函数 动态 数据类型 | 更新日期: 2023-09-27 18:05:39
我有以下功能:
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。这是对动态的正确使用吗?有别的方法吗?
问题是Count()
是IEnumerable<T>
的扩展方法,因此它不能从动态调用(因为它不是类的真正方法)。
变量grp也是动态的,因为它是由动态变量q上的表达式产生的:
foreach (var grp in q)
因为我们不能调用动态的扩展方法(同样,它们不是类的真正成员),我们需要显式地调用扩展方法而不是Enumerable
静态类。因此将代码改为:
double currCount = Enumerable.Count(grp);
和你会看到它工作正常的Count()
, 如果你想真正使用dynamic
。
也就是说,我确实同意@John的评论,你应该考虑将其更改为非动态。实际上,你的方法接受的应该是IEnumerable>,像这样:
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;
}
如果您愿意,还可以使参数类型非泛型特定于您的用法。