对于模糊的标题感到抱歉 - 我不确定如何简洁地说出我想做什么。我将用一个例子来说明我正在使用的内容:
假设我有一个'init' has been renamed to 'init(describing:)'
基类。然后我有一些派生自Animal
:Animal
,Bear
和Cat
的课程。然后,我有一个定义如下的通用存储库:
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语句初始化存储库,然后用它完成工作。这样我就不必为每只动物重复一堆代码了。