如何使用 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
        }
    });
}