如何使用Activator.CreateInstance将泛型类型实例化为using块的一部分?

时间:2016-03-15 22:10:04

标签: c# using activator

我想要实现的是将以下方法转换为更通用的方法:

    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来创建泛型类型的实例。这可能吗?如果是这样,我该怎么做?

1 个答案:

答案 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
        }
    });
}