代码之家  ›  专栏  ›  技术社区  ›  user2877820

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

  •  0
  • user2877820  · 技术社区  · 6 年前

    我正在尝试创建一个静态(因此不是泛型)类,该类包含一个名为

    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应等于初始化时的T。

    有办法做到这一点吗?如果没有,是否有一个有用的模式来完成类似的事情?

    非常感谢!

    1 回复  |  直到 6 年前
        1
  •  3
  •   Jon Skeet    6 年前

    我认为你在这里做了一个错误的假设:

    我正在尝试创建一个静态(因此不是泛型)类

    静态类绝对可以是泛型的。我相信你只是想:

    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 是静态类的一个非常奇怪的名称-听起来应该是 基础 类,但不能从静态类派生任何内容。

    第二,这只是一个光荣的单件模式。我鼓励您研究依赖注入,而不是将其作为处理这类事情的更好方法。