2016-11-26 7 views
0

上に指定せずにジェネリック型を解決:Iは、インターフェイスの次の階層有する界面

public class Repository<TEntity> : IRepository<TEntity> 
    where TEntity : IEntity 
{ 
    public TEntity GetOne(object key) { ... } 
} 

:私のリポジトリ層で

public interface IEntity { object Key; } 
public interface IEntity<TKey> { TKey TypedKey; } 

を、私は現在ように定義GetOne方法を有しますリポジトリの引数を、エンティティの汎用インタフェースで指定されたTKey型に制約したいと思います。明白な解決策は次のようになります。

public class Repository<TEntity, TKey> : IRepository<TEntity, TKey> 
    where TEntity : IEntity<TKey> 
{ 
    public TEntity GetOne(TKey key) { ... } 
} 

これは動作しますが、リポジトリの作成、またはインタフェースを介して、それを注入する際に、明示的に処理鍵を指定するために私を必要とします。私は何をしたいのは、(次のコードは、しかし、動作しません)このようなものです:

public class Repository<TEntity> : IRepository<TEntity> 
    where TEntity : IEntity 
{ 
    public TEntity GetOne<TKey>(TKey key) where TEntity : IEntity<TKey> { ... } 
} 

は、クラスでそれを指定せずにIEntityの一般的なパラメータであることを処理鍵を制約することで、すべての可能ですか?もしそうなら、どうすればいいのですか?

+0

'public classリポジトリ:IRepository ここで、TEntity:IEntity '? – ColinM

+0

@ColinMメソッドを 'GetOne(string)'として定義することもできます。要点は、キーがint、string、long、または複合オブジェクトであってもよいことです。 –

答えて

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) 
    { 
     ...; 
    } 
} 

私は、後に他の何かを考えるかもしれないが、今のところ、私はあなたが両方の通過せずにそれを行うことができるとは思いません一般的な議論。

インターフェイスの継承では、IEntity<TKey>の代わりにTEntityを返すことができます。

関連する問題