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

C# 将多个委托参数作为列表传递给扩展函数,c#,generics,extension-methods,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 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>();    
}

我个人并不介意重写扩展函数,我可能会在
Forest
上创建第三个属性或方法来实现这一点。但是,假设您有充分的理由,您是否考虑过使用
params

public static IEnumerable<TInnerObject> GetInnerBaseObjects<TInnerObject, TWrapperObject>(this TWrapperObject source, params Func<TWrapperObject, IEnumerable<TInnerObject>>[] innerObjectlist)
{
    return innerObjectlist.SelectMany(f => f(source));
}
公共静态IEnumerable GetInnerBaseObjects(此TWrapperObject源,参数Func[]innerObjectlist)
{
返回innerObjectlist.SelectMany(f=>f(source));
}
用法:

forest.GetInnerBaseObjects<animal, Forest>(f => f.catlist, f => f.lionlist);
forest.GetInnerBaseObjects(f=>f.catlist,f=>f.lionlist);

出于好奇……为什么不使用动物列表?@JustinPihony,因为森林是一个从xml文件反序列化的对象。我无法控制xml架构。一个xml文件包含一个包含多个动物的林(来自同一个基)。已更改somefunction()的签名。希望这将清楚地表明,我需要对一个对象,这是从外部提供的工作。完美。非常感谢。是的,我这样做有很好的理由。
var res = obj.GetInnerBaseObjects(
            {
                (x)=>x.catlist , (y)=>y.lionlist     
            });
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);