2017-02-22 12 views
0

私は、どのジェネリック関数が呼び出されたかに基づいてクラスを返すファクトリを実装しようとしています。genericに基づいたファクトリリターン型

InvoiceRepository repo = RepositoryFactory.GetInstance<Invoice, InvoiceRepository>(); 

これは動作しますが、私はむしろ戻り値の型を宣言する必要はありませんと思います。このようにそれを呼び出す

public static TRepository GetInstance<T, TRepository>() 
    where TRepository : IRepository<T>, new() 
{ 
    return new TRepository(); 
} 

は、私は現在、それはこのように取り組んできました。

InvoiceRepository repo = RepositoryFactory.GetInstance<Invoice>(); 

それは本当に重要ではないが、それは私を悩ませていますし、任意の明白な解決策があるかどうか、私は好奇心が強い:私はこのようにそれを呼び出すしたいと思います。

+2

どのタイプの工場は建設すべきか? 'IRepository 'インターフェースを実装するタイプのためにロードされたアセンブリを検索すべきでしょうか? –

+0

これは修辞的な質問であるかどうかはわかりませんが、IRepository の実装を返す必要があります。 e:私はまだ学生ですが、他人には明白なことを少し気にしません。 – ihendriks

+0

異なる 'T'とそれに対応するリポジトリタイプの間でマップするプライベートディクショナリ(' Dictionary ')を工場で作成することができます。次に、リポジトリの構築を依頼されると、ディクショナリを使用してリポジトリのタイプを取得し、リフレクションを使用してリポジトリタイプを構築できます。 –

答えて

0
public interface IRepository<T> 
{ 
} 

public class Repository<T> : IRepository<T> 
{ 

} 

public static class RepositoryFactory 
{ 
    public static IRepository<T> GetInstance<T>() 
       where T : new() 
    { 
     return new Repository<T>(); 
    } 
} 

次に、このようにそれを呼び出す:

var repo = RepositoryFactory.GetInstance<Invoice>(); 
+0

私の実装ではジェネリックは使用していません。あなたの提案をどのように実装するのか分かりません。私のimplは次のようなものです: 'public class InvoiceRepository:IRepository {// ..}'。私はそれが役立つかどうかわからない。 – ihendriks

関連する問題