基于相同的基本类型处理多个集合

时间:2015-01-13 01:42:26

标签: c# refactoring covariance open-closed-principle

我有一系列类型集合,所有类型都派生自相同的基类,以及一组用于搜索每个类型的谓词,例如

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

有没有办法让我能够避免每种类型的重复?

我的下一步是将狗,猫和转换成一个共同的'结果'类型并返回这些相当简单的集合,但我觉得好像中间的重复应该被考虑在内,以便随着我添加更多类型的动物,它将会干净地扩展。

1 个答案:

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