public interface IProvider<Tin, Tout>
where Tin : IInput where Tout : IOutput
public class Input : IInput
public class Output : IOutput
public class Provider : IProvider<Input, Output>
Console.WriteLine("Hello!");
public static class ProviderFactory
public static IProvider<TInput, TOutput> GetProvider<TInput, TOutput>()
where TInput : IInput where TOutput : IOutput
return (IProvider<TInput, TOutput>)new Provider();
public static void Main()
IProvider<Input, Output> provider = ProviderFactory.GetProvider<Input, Output>();