如何将具有不同类型的泛型类对象初始化为单个对象

时间:2016-08-22 21:49:57

标签: c# generics inheritance casting instantiation

对于模糊的标题感到抱歉 - 我不确定如何简洁地说出我想做什么。我将用一个例子来说明我正在使用的内容:

假设我有一个'init' has been renamed to 'init(describing:)' 基类。然后我有一些派生自AnimalAnimalBearCat的课程。然后,我有一个定义如下的通用存储库:

Dog

现在,在其他一些类的其他方法中,我需要初始化一个public class AnimalRepository<TAnimal> where TAnimal : Animal, new() { // Some stuff } 对象,但类型取决于我拥有的Animal。如果我有AnimalRepository,那么我想要:

Bear

等。对于每只动物。

我最初的希望是我可以做这样的事情:

AnimalRepository<Bear> bearRepository = new AnimalRepository<Bear>(unitOfWork);

这当然是不可能的,因为那不是有效的C#代码。我想要做的事情的要点需要反思,我不认为我想进入那个。

然后我想我可以写一个这样的开关语句:

Type animalType; // this is either a Bear or Cat or Dog
AnimalRepository<animalType> animalRepository = new AnimalRepository<animalType>(unitOfWork);

这也是无效的,因为你不能只有string animalType; var animalRepository; switch (animalType) { case "Bear": animalRepository = new AnimalRepository<Bear>(unitOfWork); break; case "Cat": animalRepository = new AnimalRepository<Cat>(unitOfWork); break; case "Dog": animalRepository = new AnimalRepository<Dog>(unitOfWork); break; default: break; } (它说“必须初始化隐式变量”)。所以我想我能做到这一点:

var AnimalRepository

但现在它说:

“无法隐式将string animalType; AnimalRepository<Animal> animalRepository; switch (animalType) { case "Bear": animalRepository = new AnimalRepository<Bear>(unitOfWork); break; case "Cat": animalRepository = new AnimalRepository<Cat>(unitOfWork); break; case "Dog": animalRepository = new AnimalRepository<Dog>(unitOfWork); break; default: break; } 类型转换为AnimalRepository<Bear>。”

我认为这是允许的,因为AnimalRepository<Animal>来自Bear。我猜它不会像这样工作?我可以做演员吗?或者我正在尝试做的不同的解决方案?我知道我可以在switch语句的每个case中初始化存储库,并在每种情况下对每个存储库执行所有工作,但是我更喜欢让switch语句初始化存储库,然后用它完成工作。这样我就不必为每只动物重复一堆代码了。

0 个答案:

没有答案