MVC与我的问题无关。不要为这个例子感到困惑。它是一个纯粹的C#问题
问题的标题并没有很好地解释我认为的问题。
假设我有一个名为EntityBase
有些课程就像
class Entity1 : EntityBase
class Entity2 : EntityBase
我有一个抽象的存储库,可以处理实体的基本操作。声明是:
abstract class RepositoryBase<TEntity> where TEntity : EntityBase
此类有几种实现
class Repository1 : RepositoryBase<Entity1>
class Repository2 : RepositoryBase<Entity2>
现在有一些带有基础的控制器:
public abstract class RepositoryControllerBase<TRepository, TEntity>
where TRepository : RepositoryBase<TEntity>
where TEntity : EntityBase
实现就像
class Controller1 : RepositoryControllerBase<Repository1, Entity1>
class Controller2 : RepositoryControllerBase<Repository2, Entity2>
现在,您必须注意到,当控制器中的存储库类型为Repository1
时,实体类型必须为Entity1
。否则会出现编译错误。
所以,我认为有一种方法可以跳过第二种泛型并自动推断出那种类型。我只是不知道如何。有什么建议吗?
如果它是Java,那么问题可以通过?
轻松解决。用
public abstract class RepositoryControllerBase<TRepository>
where TRepository : RepositoryBase<?>
答案 0 :(得分:2)
由于某种原因,没有约束类型推断:http://blogs.msdn.com/b/ericlippert/archive/2012/03/09/why-not-automatically-infer-constraints.aspx
此外,您的想法的明显反例是使用接口:
interface IEntity1 : IEntityBase {}
interface IEntity2 : IEntityBase {}
interface IRepositoryBase<TEntity> where TEntity : class, IEntityBase {}
class Repository1 : RepositoryBase<IEntity1> {}
class Repository2 : RepositoryBase<IEntity2> {}
class Repository12 : IRepositoryBase<IEntity1>, IRepositoryBase<IEntity2> {}
public abstract class RepositoryControllerBase<TRepository, TEntity>
where TRepository : RepositoryBase<TEntity>
where TEntity : IEntityBase {}
class Controller1 : RepositoryControllerBase<Repository1, Entity1>
class Controller2 : RepositoryControllerBase<Repository2, Entity2>
class Controller12 : RepositoryControllerBase<Repository12, Entity1>
如果没有在Entity1
定义中指定Controller12
类型参数,编译器应该检查什么?