如何在非通用静态类的多个方法中使用相同的通用类型

时间:2018-07-20 06:28:02

标签: c# generics

我正在尝试创建一个静态的(因此是非通用的)类,其中包含一个名为

的方法
Initialize<T>();

此方法将在启动时调用,并将定义类的泛型类型。因此,我希望能够将其他方法的返回值设置为与T相同的类型。

结果应如下所示:

public static class ServiceClientBase
{
    private static IRestClient _client;

    public static void Initialize<T>(T restClient)
    {
        _client = restClient;
    }

    public static T GetClient()
    {
        return (T)_client;
    }
}

显然这不起作用,因为GetClient()不知道类型T。但是GetClient中的T应该等于Initialize中的T。

有没有办法做到这一点?如果不是,是否有有用的模式来完成类似的任务?

非常感谢!

1 个答案:

答案 0 :(得分:3)

我认为您在这里做出了错误的假设:

  

我正在尝试创建一个静态(因此是非通用的)类

静态类可以绝对是通用的。我相信你只是想要:

public static class ServiceClientBase<T> where T : IRestClient
{
    private static T _client;

    public static void Initialize(T restClient)
    {
        _client = restClient;
    }

    public static T GetClient()
    {
        return _client;
    }
}

然后您将使用:

ServiceClientBase<Foo>.Initialize(client);
...
Foo foo = ServiceClientBase<Foo>.GetClient();

如果您用两种不同的类型两次调用Initialize,那么您的非通用版本会导致问题-您只有一个字段。使用泛型类型,每个构造类型都有一个字段。

作为旁注,ServiceClientBase是静态类的一个非常奇怪的名称-听起来它应该是某些东西的 base 类,但静态不能派生任何东西课。

第二,这只是一个光荣的单例模式。我建议您研究依赖注入作为一种更好的方式来处理这种事情。