public static void Main()
FooBarParameters p = new FooBarParameters();
FooFactory ff = new FooFactory();
var result = ff.GetInstance(p);
public interface IFooParameters
public interface IFooParametersAdditional
int AnotherProperty { get; }
public class FooBarParameters : IFooParameters
public int Id { get; set; } = 1;
public int Bar { get; set; } = 42;
public class FooBazParameters : FooBarParameters, IFooParametersAdditional
public int Baz { get; set; } = 55;
public int AnotherProperty { get; set; } = 99;
public interface IFoo<in TFooParameters>
where TFooParameters : IFooParameters
void DoStuff(TFooParameters parameters);
public class Bar : IFoo<FooBarParameters>
public void DoStuff(FooBarParameters parameters)
throw new System.NotImplementedException();
public class Baz : IFoo<FooBazParameters>
public void DoStuff(FooBazParameters parameters)
throw new System.NotImplementedException();
public class Another : IFoo<FooBazParameters>
public void DoStuff(FooBazParameters parameters)
throw new System.NotImplementedException();
public interface IFooFactory
IFoo<IFooParameters> GetInstance(IFooParameters parameters);
public class FooFactory : IFooFactory
public IFoo<IFooParameters> GetInstance(IFooParameters parameters)