将动态数据类型传递给函数

时间:2011-08-12 13:58:42

标签: c# linq c#-4.0 dynamic

我有以下功能:

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。这是动态的正确使用吗?有没有不同的方法来做到这一点?

1 个答案:

答案 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;
    }

如果您愿意,也可以根据您的使用情况设置非泛型参数类型。但这适用于所有分组......