让我通过以下示例向您解释我正在解决的问题:
然而,这段代码不起作用(无法解析方法Hanler<>...),因为.NET编译器在编译之前需要知道在此处使用了哪种类型,那么最好的解决方案是什么呢?换句话说,我需要在运行时为类型T的每个实例请求.NET编译器获取适当的处理程序。我不想使用多个if语句来检查实例类型。 更新:抱歉遗漏了这一点,对我来说似乎很明显,但现在我明白这并不是那么明显:AnimalHandler类包含的逻辑不应该成为Cat和Dog领域对象的一部分。将它们视为纯粹的领域对象,我不希望它们知道任何类型的处理程序。
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));
然而,这段代码不起作用(无法解析方法Hanler<>...),因为.NET编译器在编译之前需要知道在此处使用了哪种类型,那么最好的解决方案是什么呢?换句话说,我需要在运行时为类型T的每个实例请求.NET编译器获取适当的处理程序。我不想使用多个if语句来检查实例类型。 更新:抱歉遗漏了这一点,对我来说似乎很明显,但现在我明白这并不是那么明显:AnimalHandler类包含的逻辑不应该成为Cat和Dog领域对象的一部分。将它们视为纯粹的领域对象,我不希望它们知道任何类型的处理程序。
Cat
和Dog
类型中放置特定的行为? - FishBasketGordo