通过匿名传递列名称的通用列表列的总和

时间:2014-09-03 13:14:30

标签: c# linq generics

我的代码就像这样

 private static void ShowSum(Label lbl, IEnumerable<dynamic> list, string columnName)
    {
        lbl.Text = list.Sum(x => x.columnName).ToString();
    }

我试图在每次调用此函数时获取特定列的总和,列名将作为参数传递给此函数。截至目前,这不起作用,因为columnName被解释为特定列名的字符串intead。实现这一目标的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

您需要使用反射来通过它的名称来获取动态对象的属性:

lbl.Text = list.Sum(x => x.GetType().GetProperty(columnName).GetValue(x, null)).ToString();

但我建议你使用强类型而不是动态。至少你可以在编译时而不是运行时捕获一些错误。

答案 1 :(得分:1)

如果您知道运行时的列表类型:

private static void ShowSum<T>(Label lbl, IEnumerable<T> list, Func<T, int> columnMapper)
    {
        lbl.Text = list.Sum(x => columnMapper(x)).ToString();
    }