我正在尝试创建一个静态的(因此是非通用的)类,其中包含一个名为
的方法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。
有没有办法做到这一点?如果不是,是否有有用的模式来完成类似的任务?
非常感谢!
答案 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 类,但静态不能派生任何东西课。
第二,这只是一个光荣的单例模式。我建议您研究依赖注入作为一种更好的方式来处理这种事情。