C# 将表达式作为参数传递

C# 将表达式作为参数传递,c#,generics,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(groupByExpr

我正在尝试构建一个通用的
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);
}
var result=GenericGroupBy(dataList,g=>g.Id);
公共对象GenericGroupBy(对象数据,Func groupByExpression)
{
返回((列表)数据).GroupBy(groupByExpression);
}
但是我不能让它工作


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

目前存在两个问题:

  • 您的方法需要一个
    Func
    ,我怀疑
    g=>g.Id
    会失败,因为您的
    Id
    属性不是
    bool
  • 您当前正在指定
    List
    作为类型参数,而我怀疑您确实想要
    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);
}

请注意,我还将强制转换从
List
更改为
IEnumerable
——您不需要将其转换为
List
,那么为什么要转换为它呢?

目前,您的方法接受一个参数,该参数接受
t
,并返回一个
bool
。。。我怀疑
g.Id
是一个傻瓜。同样,我怀疑您想要的类型参数是
DTO
,而不是
List
dataList
变量的类型是什么(不是实际的运行时类型,只是编译时类型)?如果您静态地知道
T
,为什么不将
data
定义为
List
而不是
object
?@JonSkeet将
List
更改为
DTO
并将
Func
更改为
Func
。你能把这个评论作为回答吗,我会接受的…@Nalaka526当时真的没有理由使用这个方法。您应该只调用
GroupBy
。这种方法根本没有增加任何实际价值。它所做的只是通过将返回类型强制转换为
对象
,将值去掉,使其几乎一文不值。
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);
}