2014-09-03 81 views
1

我的代码是这样的总和泛型列表的列匿名

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

我想每次当我调用该函数的时间去一个特定的列的总和,列名会作为参数传递给这个函数。截至目前,这不起作用,因为columnName被解释为特定列名称的字符串intead。什么是实现这一目标的正确方法?

+0

你知道在编译时字符串(和列表的类型),或者是你在运行时获得的列名? – 2014-09-03 13:24:18

回答

3

您需要通过它的名称使用反射来得到一个动态对象的属性:

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

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

1

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

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

不需要知道类型:对于参数我们可以使用'Func columnMapper',然后对于sum选择器,'x => Convert.ToDouble((object)columnMapper(x))' 。这将接受任何匿名类型并允许列返回任何数字类型(或null)。 – nmclean 2014-09-03 13:36:55

+0

确实如此,但在动态类型不是必需的情况下,如果我们避免使用动态类型,我们可以获得更好的性能(在这种情况下,因为您需要反射)并输入安全性。 – brz 2014-09-03 15:51:08