解析泛型类型而不在接口上指定它

时间:2016-11-26 00:14:19

标签: c# generics

我有以下接口层次结构:

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的通用参数而不在类上指定它?如果是这样,我该怎么做?

1 个答案:

答案 0 :(得分:1)

在没有通过TEntityTkey的情况下,您距离越近,对我来说就是:

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>