[英]How can I use Activator.CreateInstance to instantiate a generic type as part of a using block?
What I'd like to achieve is to convert the following method to something more generic: 我想要实现的是将以下方法转换为更通用的方法:
private Task<TestResult> SpecificServiceWarmUp(string serviceEndPoint)
{
return Task<TestResult>.Factory.StartNew(() =>
{
using (var service = new MySpecificClient(serviceEndPoint))
{
// do some stuff with specific client
}
});
}
A more generic version would look like: 更通用的版本如下所示:
private Task<TestResult> GenericServiceWarmUp<TService>(string serviceEndPoint)
{
return Task<TestResult>.Factory.StartNew(() =>
{
using (/* instance of TService */)
{
// do some stuff with generic client
}
});
}
What I don't know is how to tell the using
block to use Activator
to create the instance of the generic type. 我不知道如何告诉using
块使用Activator
创建泛型类型的实例。 Is this possible? 这可能吗? If so, how can I do this? 如果是这样,我该怎么做?
You can add a constraint on your generic type parameter like that: 您可以像这样在通用类型参数上添加约束 :
private Task<TestResult> GenericServiceWarmUp<TService>()
where TService : IDisposable
{
return Task<TestResult>.Factory.StartNew(() =>
{
using (var service =
(TService)Activator.CreateInstance(typeof(TService), serviceEndPoint))
{
// do some stuff with generic client
}
});
}
Otherwise if your service has no constructor parameter you don't need to use Activator.CreateInstance
, there is a new()
constraint : 否则,如果您的服务没有构造函数参数 ,则无需使用Activator.CreateInstance
,则存在new()
约束 :
private Task<TestResult> GenericServiceWarmUp<TService>(string serviceEndPoint)
where TService : IDisposable, new()
{
return Task<TestResult>.Factory.StartNew(() =>
{
using (var service = new TService())
{
// do some stuff with generic client
}
});
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.