将表达式作为参数传递

时间:2014-03-11 15:23:27

标签: c# generics

我正在尝试构建一个通用的GroupBy方法,我猜它应该是这样的

var result = GenericGroupBy<List<DTO>>(dataList, g=>g.Id);

public object GenericGroupBy<T>(object data, Func<T, bool> groupByExpression)
{
    return ((List<T>)data).GroupBy(groupByExpression);
}

但我无法使其发挥作用。

如何传递g=>g.Id等表达式?

1 个答案:

答案 0 :(得分:1)

目前存在两个问题:

  • 您的方法需要Func<T, bool>我怀疑g => g.Id失败,因为您的Id属性不是bool
  • 当我怀疑你真的只想List<DTO>时,你当前正在指定DTO作为类型参数。

鉴于您的意见,这将有效:

var result = GenericGroupBy<DTO>(dataList, g => g.Id);

public object GenericGroupBy<T>(object data, Func<T, int> groupByExpression)
{
    return ((List<T>)data).GroupBy(groupByExpression);
}

...但除非您始终想要按int进行分组,否则我会更加一般:

var result = GenericGroupBy<DTO, int>(dataList, g => g.Id);

public object GenericGroupBy<TElement, TKey>
    (object data, Func<TElement, TKey> groupByExpression)
{
    return ((IEnumerable<TElement>)data).GroupBy(groupByExpression);
}

请注意我如何将演员阵容从List<T>更改为IEnumerable<T> - 您 需要成为List<T>那么为什么要这样做?