public static void Main()
var service = new DataServiceAdapter<SpecificDisposableDataService>();
var client = new Client(service);
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 readonly TService _service;
private readonly Func<Func<TService, dynamic>, dynamic> _run;
public DataServiceAdapter()
if (typeof(IDisposable).IsAssignableFrom(typeof(TService)))
_service = new TService();
private dynamic RunWithUsing(Func<TService, dynamic> func)
using (var service = (IDisposable) new TService())
return func((TService)service);
private dynamic RunWithoutUsing(Func<TService, dynamic> func)
public dynamic Run(Func<TService, dynamic> 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
dynamic Run(Func<TService, dynamic> func);
public interface IDataService