我有这个方法,需要为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);
答案 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>
等。