无法在C#中调用扩展方法

时间:2018-12-14 23:42:54

标签: c# .net

我有以下课程;

public static class statiClass
{
    public static DataTable ToPivotTable<T, TColumn, TRow, TData>(
 this IEnumerable<T> source,
 Func<T, TColumn> columnSelector,
 Expression<Func<T, TRow>> rowSelector,
 Func<IEnumerable<T>, TData> dataSelector)
    {
    DataTable table = new DataTable();
    var rowName = ((MemberExpression)rowSelector.Body).Member.Name;
    table.Columns.Add(new DataColumn(rowName));
    var columns = source.Select(columnSelector).Distinct();

    foreach (var column in columns)
        table.Columns.Add(new DataColumn(column.ToString()));

    var rows = source.GroupBy(rowSelector.Compile())
                     .Select(rowGroup => new
                     {
                         Key = rowGroup.Key,
                         Values = columns.GroupJoin(
                             rowGroup,
                             c => c,
                             r => columnSelector(r),
                             (c, columnGroup) => dataSelector(columnGroup))
                     });

    foreach (var row in rows)
    {
        var dataRow = table.NewRow();
        var items = row.Values.Cast<object>().ToList();
        items.Insert(0, row.Key);
        dataRow.ItemArray = items.ToArray();
        table.Rows.Add(dataRow);
    }

    return table;
}

我不能从另一个像下面这样的班级打电话给他;

dtTA.ToPivotTable(
                item => item.Year,
               item => item.Product,
               items => items.Any() ? items.Sum(x => x.Sales) : 0);

它会引发类似;

的错误
DataTable' does not contain a definition for 'ToPivotTable' and no accessible extension method 'ToPivotTable'

我搜索了很多,却没有找到有趣的解决方案。

我该如何解决?

3 个答案:

答案 0 :(得分:2)

您在IEnumerable界面中注册扩展方法(由方法定义中的以下参数指示:this IEnumerable<T> source),而(根据错误消息判断)尝试从{{1 }}实例。仅仅因为DataTable未实现DataTablesource)而出现错误。只需将IEnumerable替换为IEnumerableDataTable类实现的其他接口,使您的方法适应这些更改,该方法就可以正常工作。

答案 1 :(得分:2)

首先将dtTA转换为IEnumerable源 然后,您可以按来源调用ToPivotTable 像下面这样(对我们很有帮助):

//first convert dtTA to IEnumerable source
        var source = dtTA
            .Select()
            .Select(x => new 
            {
                Year = (string)x["Year"],
                Product = (string)x["Product"],
                Sales = (int)x["Sales"]
            }).ToList();
        //then , you can call ToPivotTable by source
        source.ToPivotTable(
            item => item.Year,
           item => item.Product,
           items => items.Any() ? items.Sum(x => x.Sales) : 0);

答案 2 :(得分:0)

不是通过AsEnumerable方法将DataTable转换为IEnumerable吗?

我想念什么吗?

dtTA.AsEnumerable().ToPivotTable(
           item => item.Year,
           item => item.Product,
           items => items.Any() ? items.Sum(x => x.Sales) : 0);