2014-04-30 44 views
0

我已经被称为针对不同性质(返回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

您是否使用动态linq进行了研究?它允许你传递字符串作为linq表达式而不是lambda表达式。 –

回答

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>等。

+0

这是一个很好的答案,只是我不确定的一件事,'Func > selector'中的'Child'是什么? – Yahya

+0

想通了。谢谢。 – Yahya

+0

@Yahya:很高兴帮助,欢呼。 – Jon