迭代属性并在lambda表达式中使用每个属性

时间:2018-04-18 09:00:10

标签: c# reflection lambda

我试图通过迭代表中的列来简化我的代码,并使用每列映射到一个值,而不是让多行代码具有单个不同的值。 所以从这里开始:

foreach(var n in groupedResults){
    SetCellForData("Column1", n.Sum(x => x.ColumnName1FromTable));
    SetCellForData("Column2", n.Sum(x => x.ColumnName2FromTable));
    ...
    SetCellForData("Column10", n.Sum(x => x.ColumnName10FromTable));
}

对于这样的事情:

var columnProperties = typeof(TableClass).GetProperties().Select(t => t);
foreach(var n in groupedResults){
    foreach(var columnProperty in columnProperties ){
        SetCellForData(columnProperty.Name, n.Sum(x => x.????);
    }
}

哪里???? part使用columnProperty对n个分组结果中的列求和。

1 个答案:

答案 0 :(得分:0)

由于arekzyla在我确认这是我需要的之前决定删除他的答案,所以我决定用arekzyla的答案回答我自己的问题。

此方法创建函数:

private static Func<T, U> GetPropertyFunc<T, U>(string propertyName)
{
    var parameter = Expression.Parameter(typeof(T));
    var body = Expression.PropertyOrField(parameter, propertyName);
    var lambda = Expression.Lambda<Func<T, U>>(body, parameter);
    return lambda.Compile();
}

此代码遍历数据库类型中的属性,并为每个属性创建一个返回整数的函数。

var columnProperties = typeof(DatabaseType).GetProperties()
            .Where(x => x.PropertyType == typeof(int))
            .Select(t => new { t.Name, GetPropertyFunc = GetPropertyFunc<DatabaseType, int>(t.Name) })
            .ToList();

然后我们迭代一些分组列表:

foreach (var n in groupedList)
{
    foreach (var property in columnProperties)
    {
        var sumOfElementsInGrouping = n.Sum(x => property.GetPropertyFunc(x));
    }   
}

然后我们根据属性得到特定列的总和。