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

C# 如何在非泛型静态类的多个方法中使用相同的泛型类型,c#,generics,C#,Generics,我试图创建一个静态(因此是非泛型)类,其中包含一个名为 Initialize<T>(); Initialize(); 此方法将在启动时调用,并将定义类的泛型类型。所以我希望能够将其他方法的返回值设置为与T相同的类型 结果应该如下所示: public static class ServiceClientBase { private static IRestClient _client; public static void Initialize<T>(

我试图创建一个静态(因此是非泛型)类,其中包含一个名为

Initialize<T>();
Initialize();
此方法将在启动时调用,并将定义类的泛型类型。所以我希望能够将其他方法的返回值设置为与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;
    }
}
公共静态类ServiceClientBase
{
私有静态IRestClient\u客户端;
公共静态无效初始化(T restClient)
{
_client=restClient;
}
公共静态T GetClient()
{
返回(T)\客户;
}
}
显然这不起作用,因为GetClient()不知道类型T。但是GetClient中的T应该等于Initialize中的T

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


非常感谢

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

我试图创建一个静态(因此是非泛型)类

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

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,其中T:IRestClient
{
私有静态T_客户端;
公共静态无效初始化(T restClient)
{
_client=restClient;
}
公共静态T GetClient()
{
返回客户;
}
}
然后你会使用:

ServiceClientBase<Foo>.Initialize(client);
...
Foo foo = ServiceClientBase<Foo>.GetClient();
ServiceClientBase.Initialize(客户端);
...
Foo-Foo=ServiceClientBase.GetClient();
如果您使用两种不同的类型调用了两次
Initialize
,那么非泛型版本将导致问题-您只有一个字段。对于泛型类型,每个构造类型都有一个字段

作为旁注,
ServiceClientBase
对于静态类来说是一个非常奇怪的名称-听起来它应该是某个类的基类,但是没有任何东西可以从静态类派生


其次,这只是一种美化的单身模式。我鼓励您研究依赖注入,而不是作为处理这类事情的更好方法。

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

我试图创建一个静态(因此是非泛型)类

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

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,其中T:IRestClient
{
私有静态T_客户端;
公共静态无效初始化(T restClient)
{
_client=restClient;
}
公共静态T GetClient()
{
返回客户;
}
}
然后你会使用:

ServiceClientBase<Foo>.Initialize(client);
...
Foo foo = ServiceClientBase<Foo>.GetClient();
ServiceClientBase.Initialize(客户端);
...
Foo-Foo=ServiceClientBase.GetClient();
如果您使用两种不同的类型调用了两次
Initialize
,那么非泛型版本将导致问题-您只有一个字段。对于泛型类型,每个构造类型都有一个字段

作为旁注,
ServiceClientBase
对于静态类来说是一个非常奇怪的名称-听起来它应该是某个类的基类,但是没有任何东西可以从静态类派生


其次,这只是一种美化的单身模式。我鼓励您研究依赖注入,而不是作为处理这类事情的更好方法。

因为您的所有参数似乎都被分配给
\u client
,它属于
IRestClient
类型,您可能需要一些通用的sonstraint:
其中T:I RestClient
?如果调用
Initialize
然后调用
Initialize
,您希望发生什么?听起来你真的想要一个泛型类,而静态类可以是泛型的。因为你的所有参数似乎都被分配给了
\u client
,这是
IRestClient
类型,您可能需要一些通用的sonstraint:
其中T:I RestClient
?如果调用
Initialize
然后调用
Initialize
,您希望发生什么?听起来你真的想要一个泛型类,而静态类也可以是泛型的。@HimBromBeere:是的,我以前没有注意到它,谢谢你。(尽管必须承认,当字段类型为t:]时,不需要约束)我已经使用DI来解决我的问题。谢谢你的邀请tip@HimBromBeere:是的,我以前没注意到-谢谢你。(尽管必须承认,当字段类型为t:]时,不需要约束)我已经使用DI来解决我的问题。谢谢你的提示