在我的代码中,我有 ManagerService
的T
类型可以是 BaseManager
或AnotherManager
:
abstract class BaseManager { }
abstract class FooManager : BaseManager { }
abstract class AnotherManager : BaseManager { }
class ManagerService<T> where T : BaseManager { }
现在我想通过 string
获取特定对象:
static ManagerService<T> GetService<T>(string serviceName) where T : BaseManager
{
switch(serviceName)
{
case "foo": return new ManagerService<FooManager>();
case "another": return new ManagerService<AnotherManager>();
}
throw new ArgumentException("Service not found");
}
这里是用法:
static void Main(string[] args)
{
var serviceBase = GetService("foo"); // it should return ManagerService<FooManager>
var serviceAnother = GetService("another"); // it should return ManagerService<AnotherManager>
}
不幸的是,这不起作用。我遇到错误:
Cannot implicitly convert type 'app.ManagerService<app.FooManager>' to 'app.ManagerService<T>'
。
哪里出了问题?
最佳答案
调用GetService<T>(string serviceName)
时, 通用类型 T
必须在编译时已知。要么您需要在调用时指定它,要么编译器必须能够从方法的参数派生它(但您没有这样的参数)。
您可以通过消除 serviceName
来解决这个问题并使用 T
相反,像这样:
static ManagerService<T> GetService<T>() where T : BaseManager
{
return new ManagerService<T>();
}
static void Main(string[] args)
{
var s1 = GetService<FooManager>(); // returns ManagerService<FooManager>
var s2 = GetService<AnotherManager>(); // returns ManagerService<AnotherManager>
}
如果您不知道T
-s 提前(你只知道 serviceName
在运行时)然后你可以使用抽象基类型 BaseManager
:
abstract class ManagerService { }
class ManagerService<T> : ManagerService where T : BaseManager { }
static ManagerService GetService(string serviceName)
{
switch(serviceName)
{
case "foo":
return new ManagerService<FooManager>();
case "another":
return new ManagerService<AnotherManager>();
}
throw new ArgumentException("Service not found");
}
static void Main(string[] args)
{
var s1 = GetService("foo"); // returns ManagerService<FooManager> typed as ManagerService
var s2 = GetService("another"); // returns ManagerService<AnotherManager> typed as ManagerService
}
关于c# - 从 switch 语句返回对象(T),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51589726/