以下のクラス階層を検討してください
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
});
使用時にこれを単純化するためのアイデア。拡張関数を書き直しても構いません