将多个委托参数作为列表传递给扩展函数

时间:2013-08-05 16:06:01

标签: c# generics extension-methods

考虑下面的类层次结构

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

在使用时简化此操作的任何想法。我不介意重写扩展功能

1 个答案:

答案 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);