public static void Main()
var mock = new Mock<IRepository<object, int>>();
mock.SetupGet(x => x.Foo).Returns(new Foo<object>());
var service = new Service<object, int>(mock.Object);
Console.WriteLine(mock.Object.Foo.GetHashCode());
Console.WriteLine(service.Foo.GetHashCode());
public interface IRepository<T>
public interface IRepository<T, TK> : IRepository<T>
new Foo<T> Foo { get; set; }
public IRepository<T> Repository { get; set; }
public Foo Foo { get; set; }
public Service(IRepository<T> repository)
public class Service<T, TK> : Service<T>
public new IRepository<T, TK> Repository
get { return (IRepository<T, TK>)base.Repository; }
set { base.Repository = value; }
public Service(IRepository<T, TK> repository) : base(repository)
public int Id { get; set; }
public class Foo<T> : Foo