如何使用 Activator.CreateInstance 将泛型实例化为 using 块的一部分?
How can I use Activator.CreateInstance to instantiate a generic type as part of a using block?
我想要实现的是将以下方法转换为更通用的方法:
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
创建通用类型的实例。这可能吗?如果是这样,我该怎么做?
你可以这样添加一个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
}
});
}
我想要实现的是将以下方法转换为更通用的方法:
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
创建通用类型的实例。这可能吗?如果是这样,我该怎么做?
你可以这样添加一个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
}
});
}