我有以下接口层次结构:
public interface IEntity { object Key; }
public interface IEntity<TKey> { TKey TypedKey; }
在我的存储库层中,我有一个GetOne
方法,当前定义如下:
public class Repository<TEntity> : IRepository<TEntity>
where TEntity : IEntity
{
public TEntity GetOne(object key) { ... }
}
我想将存储库中的参数约束为实体的通用接口指定的TKey
类型。显而易见的解决方案是:
public class Repository<TEntity, TKey> : IRepository<TEntity, TKey>
where TEntity : IEntity<TKey>
{
public TEntity GetOne(TKey key) { ... }
}
这有效,但要求我在创建存储库时明确指定TKey,或者通过接口注入它。我想做的是这样的事情(但下面的代码不起作用):
public class Repository<TEntity> : IRepository<TEntity>
where TEntity : IEntity
{
public TEntity GetOne<TKey>(TKey key) where TEntity : IEntity<TKey> { ... }
}
是否可以将TKey限制为IEntity的通用参数而不在类上指定它?如果是这样,我该怎么做?
答案 0 :(得分:1)
在没有通过TEntity
和Tkey
的情况下,您距离越近,对我来说就是:
public interface IEntity
{
object Key { get; set; }
}
public interface IEntity<TKey> : IEntity
{
TKey TypedKey { get; set; }
}
public class Repository<TEntity>
where TEntity : IEntity
{
public IEntity<TKey> GetOne<TKey>(TKey key)
{
...;
}
}
我可能会在以后考虑其他事情,但就目前而言,我并不认为你可以在不通过两个通用论据的情况下做到这一点。
使用界面继承,您只需返回TEntity
而不是IEntity<TKey>
。