考虑下面的类层次结构
public class animal
{
}
public class lion:animal
{
}
public class cat:animal
{
}
public class Forest
{
public List<lion> lionlist = new List<lion>();
public List<cat> catlist = new List<cat>();
}
我需要森林里的所有动物。
从森林中检索所有动物的扩展功能
public static IEnumerable<TInnerObject> GetInnerBaseObjects<TInnerObject, TWrapperObject>(this TWrapperObject source,List< Func<TWrapperObject, IEnumerable<TInnerObject>>> innerObjectlist)
{
List<TInnerObject> retlist = new List<TInnerObject>();
innerObjectlist.ForEach(x =>
{
if (x(source) != null)
{
retlist.AddRange(x(source));
}
});
return retlist;
}
一切都很好。但在使用时,扩展功能的使用有点混乱
void somefunction(Forest obj)
{
//.....
var res = obj.GetInnerBaseObjects(new List<Func<Forest, IEnumerable<animal>>>()
{
(x)=>x.catlist , (y)=>y.lionlist
});
}
在使用点处委托列表的实例化有点混乱。我希望它比下面的代码更简单。当然它不是有效的代码!
var res = obj.GetInnerBaseObjects(
{
(x)=>x.catlist , (y)=>y.lionlist
});
在使用时简化此操作的任何想法。我不介意重写扩展功能
答案 0 :(得分:2)
就个人而言,我可能会在Forest
上创建第三个属性或方法来执行此操作。但是,假设您有充分的理由,您是否考虑过使用params
?
public static IEnumerable<TInnerObject> GetInnerBaseObjects<TInnerObject, TWrapperObject>(this TWrapperObject source, params Func<TWrapperObject, IEnumerable<TInnerObject>>[] innerObjectlist)
{
return innerObjectlist.SelectMany(f => f(source));
}
用法:
forest.GetInnerBaseObjects<animal, Forest>(f => f.catlist, f => f.lionlist);