我想要实现的是将以下方法转换为更通用的方法:
private Task<TestResult> SpecificServiceWarmUp(string serviceEndPoint)
{
return Task<TestResult>.Factory.StartNew(() =>
{
using (var service = new MySpecificClient(serviceEndPoint))
{
// do some stuff with specific client
}
});
}
更通用的版本如下:
private Task<TestResult> GenericServiceWarmUp<TService>(string serviceEndPoint)
{
return Task<TestResult>.Factory.StartNew(() =>
{
using (/* instance of TService */)
{
// do some stuff with generic client
}
});
}
我不知道如何告诉using
块使用Activator
来创建泛型类型的实例。这可能吗?如果是这样,我该怎么做?
答案 0 :(得分:5)
您可以像这样添加constraint on your generic type parameter:
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
}
});
}
否则,如果您的服务没有构造函数参数,则无需使用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
}
});
}