我有一系列类型集合,所有类型都派生自相同的基类,以及一组用于搜索每个类型的谓词,例如
public abstract class Animal { ... }
public class Dog : Animal { ... }
public class Cat : Animal { ... }
...
Func<Dog, bool> DogFinder = ...;
Func<Cat, bool> CatFinder = ...;
...
List<Dog> Dogs = GetDogs(DogFinder);
List<Cat> Cats = GetCats(CatFinder);
有没有办法让我能够避免每种类型的重复?
我的下一步是将狗,猫和转换成一个共同的'结果'类型并返回这些相当简单的集合,但我觉得好像中间的重复应该被考虑在内,以便随着我添加更多类型的动物,它将会干净地扩展。
答案 0 :(得分:0)
你可以使用泛型来消除一些重复,例如:
List<TAnimal> GetAnimals<TAnimal>(Func<TAnimal, bool> predicate) : where TAnimal : Animal
{
...
}
然后你可以像这样打电话:
List<Dog> Dogs = GetAnimals(DogFinder);
List<Cat> Cats = GetAnimals(CatFinder);
您还可以重载方法(和谓词)以在params中取两个并返回基类型的列表,如下所示:
List<Animal> GetAnimals(Func<TAnimal1, TAnimal2, bool> predicate)
: where TAnimal1 : Animal
: where TAnimal2 : Animal
{
...
}
然后你可以用一个新的谓语将你的狗和猫放在一起:
Func<Dog, Cat, bool> DogAndCatFinder = ...;
得到你的清单:
List<Animal> DogsAndCats = GetAnimals(DogAndCatFinder);