【发布时间】:2012-02-02 16:32:22
【问题描述】:
我有一个使用泛型参数并需要实例的向下转换形式的方法。例如,
public abstract class Animal {
}
public class Dog : Animal {
}
public class Cat : Animal {
}
public class AnimalHandler {
public virtual void Pet<T>(T animal)
{
}
}
给定一组动物。
public List<Animal> Animals { get; set; }
在调用 Pet 方法之前,如何让个别动物失望?
我目前正在以这种形式工作。
if (animal is Dog) {
_animalHandler.Pet((Dog)animal);
}
if (animal is Cat) {
_animalHandler.Pet((Cat)animal);
}
理想情况下,应该是这种形式。
var type = animal.GetType();
_animalHandler.Pet(animal.CastTo(type));
澄清:在将实例传递给方法之前,我需要实例是向下转换的类型。我需要一只狗或猫才能被传入。
【问题讨论】:
-
typeof 仅适用于我相信的类名或泛型。
-
在 AnimalHandler 中,为什么将 Dog 视为 Dog 而不是 Animal 很重要?对象是一条狗,但你为什么一定要知道它呢?这个 Pet 方法做了什么?请记住,该方法不能对 T 做出任何假设,除了约束可能揭示的内容。
-
对于泛型方法来说,通常(并非总是)不好的做法是使用它的类型参数来做事。它使它...不那么通用...
-
@Anthony,因为我们使用 NHibernate 存储库的通用接口,而通用类型将确定查询运行的映射(和表)。
-
@AK_,我同意。然而,由于有限的表结构,我们必须在进行数据库调用之前进行向下转换,即使我们没有使用向下转换类型的任何属性。
标签: c# inheritance abstract-class