如何获得IEnumerable <object>的linq和

Mik*_*ike 6 .net c# generics reflection

如何获取IEnumerable对象集合中的数字总和?我确信底层类型将始终为数字,但类型是在运行时确定的.

IEnumerable<object> listValues = data.Select(i => Convert.ChangeType(property.GetValue(i, null), columnType));
Run Code Online (Sandbox Code Playgroud)

之后我希望能够执行以下操作(以下内容有错误:"无法解析方法总和"):

var total = listValues.Sum();
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?谢谢.

Ree*_*sey 11

如果你知道确切的类型总是一个数字类型,你应该可以使用类似的东西:

double total = listValues.Sum(v => Convert.ToDouble(v));
Run Code Online (Sandbox Code Playgroud)

这将起作用,因为Convert.ToDouble它将寻找IConvertible,这是由核心数字类型实现的.您强制类型为a double而不是原始类型.


Lee*_*Lee 5

您可以使用表达式树生成所需的添加函数,然后折叠输入列表:

private static Func<object, object, object> GenAddFunc(Type elementType)
{
    var param1Expr = Expression.Parameter(typeof(object));
    var param2Expr = Expression.Parameter(typeof(object));
    var addExpr = Expression.Add(Expression.Convert(param1Expr, elementType), Expression.Convert(param2Expr, elementType));
    return Expression.Lambda<Func<object, object, object>>(Expression.Convert(addExpr, typeof(object)), param1Expr, param2Expr).Compile();
}

IEnumerable<object> listValues;
Type elementType = listValues.First().GetType();
var addFunc = GenAddFunc(elementType);

object sum = listValues.Aggregate(addFunc);
Run Code Online (Sandbox Code Playgroud)

请注意,这要求输入列表非空,但它的优点是保留结果中的元素类型。