让我在以下示例中向您解释我要解决的问题:
class Animal {}
class Cat: Animal {}
class Dog : Animal { }
interface IAnimalHandler<in T> where T: Animal
{
void Handle(T animal);
}
class AnimalHandler :
IAnimalHandler<Cat>,
IAnimalHandler<Dog>
{
public void Handle(Cat animal)
{
Console.Write("it's a cat !");
}
public void Handle(Dog animal)
{
Console.Write("it's a dog !");
}
}
所以现在我想遍历所有动物并像这样运行适当的处理程序:
var ah = new AnimalHandler();
var animals = new List<Animal> { new Cat(), new Dog() };
animals.ForEach(a => ah.Handle(a));
但是,此代码不起作用(Can not resolve method Hanler<>...)只是因为 .NET 编译器需要在编译之前知道此处使用哪种类型,那么解决此问题的最佳方法可能是什么?换句话说,我需要让 .NET 编译器为运行时类型 T 的每个实例采用类型 T 的适当处理程序。我不想使用多个if
语句检查实例类型。
更新:很抱歉错过了它,这对我来说似乎很明显,但现在我明白它并不那么明显:AnimalHandler 类包含不应该是域对象 Cat 和 Dog 的一部分的逻辑。将它们视为纯粹的普通域对象,我不希望它们知道任何类型的处理程序