1

以下のクラス階層を検討してください

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     
            });

使用時にこれを単純化するためのアイデア。拡張関数を書き直しても構いません

4

1 に答える 1