c# - 从 switch 语句返回对象(T)

标签 c# generics

在我的代码中,我有 ManagerServiceT类型可以是 BaseManagerAnotherManager :

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/

相关文章:

c# - 从数据点列表中获取不同的项目

haskell - 如何从类型表示中获取 Data.Data.Constr 等?

c# - C# 中的重叠面板

C# 泛型接口(interface)协变

java - 使用泛型 java 进行类声明

java - 需要帮助理解此方法

Java反射在使用泛型时获取运行时类型

c# - 使用 C# 在 Oracle 中输入 Alter User 语句

c# - 如何使用 LINQ 通过 StartWith 对自定义项进行排序

C# 检查二维数组中的任何元素是 NaN 还是 Infinity 的最佳方法