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

本文关键字:函数 动态 数据类型 | 更新日期: 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;
    }

如果您愿意,还可以使参数类型非泛型特定于您的用法。