public static void Main()
var service = new DataServiceAdapter<SpecificDisposableDataService>();
var client = new Client(service);
var service2 = new DataServiceAdapter<SpecificNotDisposableDataService>();
var client2 = new Client(service2);
private readonly IDataServiceAdapter<IDataService> _service;
public Client(IDataServiceAdapter<IDataService> service)
public void ClientMethod()
Console.WriteLine(_service.Run(s => s.Foo()));
Console.WriteLine(_service.Run(s => s.Bar("Hello")));
public class DataServiceAdapter<TService> : IDataServiceAdapter<TService>
where TService : IDataService, new()
private interface IRunner
T Run<T>(Func<TService, T> func);
private class WithUsing : IRunner
public T Run<T>(Func<TService, T> func)
using (var service = (IDisposable) new TService())
return func((TService)service);
private class WithoutUsing : IRunner
private readonly TService _service = new TService();
public T Run<T>(Func<TService, T> func)
private readonly IRunner _runner;
public DataServiceAdapter()
if (typeof(IDisposable).IsAssignableFrom(typeof(TService)))
_runner = new WithUsing();
_runner = new WithoutUsing();
public T Run<T>(Func<TService, T> func)
return _runner.Run<T>(func);
public class SpecificDisposableDataService : IDataService, IDisposable
public int Bar(string arg)
public class SpecificNotDisposableDataService : IDataService
public int Bar(string arg)
public interface IDataServiceAdapter<out TService>
where TService : IDataService
T Run<T>(Func<TService, T> func);
public interface IDataService