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

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);
于 2013-08-05T16:20:58.340 回答