将属性名称传递给聚合

时间:2014-04-30 15:36:47

标签: c# ienumerable

我有这个方法,需要为IEnumerable<string>

中的每个孩子调用不同属性(返回MyList),例如Children
    public IEnumerable<string> GetMyListAggregatedValues()
    {
        var aggregatedValues = new List<string>();
        return Children.Aggregate(aggregatedValues , (current, child) => current.Union(child.MyList).ToList());
    }

解决此问题的一种方法是针对儿童的每个属性调用它。

所以我的问题是,有没有办法以某种方式避免这种重复的代码并动态传递属性名称(不使用反射,我认为这可能是一种过度杀伤)。

因此,静态地,这些调用将像

一样
GetMyListAggregatedValues();
GetAnotherListAggregatedValues();

我追求的是什么(如果可能的话)

GetAggregatedValues(_SOMETHING_.MyList);

1 个答案:

答案 0 :(得分:2)

如果所有相关属性都实现了IEnumerable<string>,那么这很容易。只需将“给定一个孩子,访问其中一个属性”逻辑打包成一个lambda:

public IEnumerable<string> 
GetAggregatedValues(Func<Child, IEnumerable<string>> selector)
{
    var aggregatedValues = new List<string>();
    return Children.Aggregate(
        aggregatedValues , 
        (current, child) => current.Union(selector(child)).ToList()
    );
}

并用

调用它
GetAggregatedValues(c => c.MyList);

您甚至可以通过使string类型参数进一步概括,无论它出现在上面的代码中,那么相同的结构也适用于IEnumerable<int>等。