using System.Collections.Generic;
public interface IFooBar<TFoo>
public interface IFooRepository<TFoo>
public interface IFooBarRepository<TFooBar, TFoo>
where TFooBar : IFooBar<TFoo>
TFooBar DoWork(TFooBar fooBar);
public abstract class FooRepositoryBase<TFoo> : IFooRepository<TFoo>
protected IEnumerable<IFooBarRepository<IFooBar<TFoo>, TFoo>> FooBarRepositories { get; set; }
public FooRepositoryBase(params IFooBarRepository<IFooBar<TFoo>, TFoo>[] fooBarRepositories)
FooBarRepositories = fooBarRepositories.ToList();
public class MyFoo : IFoo { }
public class MyFooBar : IFooBar<MyFoo> { }
public class MyFooBarRepository : IFooBarRepository<MyFooBar, MyFoo>
public MyFooBar DoWork(MyFooBar fooBar)
throw new NotImplementedException();
public class MyFooRepository : FooRepositoryBase<MyFoo>
public MyFooRepository(params IFooBarRepository<IFooBar<MyFoo>, MyFoo>[] fooBarRepositories)
: base(fooBarRepositories)
public static void Main()
var myFooBarRepository1 = new MyFooBarRepository();
var myFooBarRepository2 = new MyFooBarRepository();
var myFooRepository2 = new MyFooRepository(
(IFooBarRepository<IFooBar<MyFoo>, MyFoo>)myFooBarRepository1,
(IFooBarRepository<IFooBar<MyFoo>, MyFoo>)myFooBarRepository2);