2011-11-15 5 views
1

ジェネリックを使用して特定のリポジトリメソッドのインターフェイスを公開するために、DALの上に何らかの種類のレイヤを構築しようとしています。例えば異なるクラスのインターフェイスを公開する

public interface A 
{ 
    void Do_A(); 
} 

public interface B 
{ 
    void Do_B(); 
} 

public void Main() 
{ 
    Exposer<A>.Do_A(); 
    Exposer<B>.Do_B(); 
} 

は、それはそれを行うことは可能ですか?

+0

をあなたが解決している特定の問題。あなたは何を求めていますか? –

+0

に基づいてインターフェイスのメソッドを公開する何らかの種類のマネージャクラスです。十分にわかりません – guyl

答えて

2

具体的には、Exposer<A>は異なるTypeからExposer<B>であるため、これは「単一クラス」ではありません。しかし、最終的には、これはこれは、たとえば、のStructureMap(純粋に例)であったならば、あなたは考えるかもしれません...ほとんどのIoC/DIコンテナにかなり違って見えるしません:

container.GetInstance<A>().Do_A(); 
container.GetInstance<B>().Do_B(); 

あなたはでしょう、もちろん、コンクリートABの実装がどこから来ているのかをコンテナに設定する必要があります。どれがStructure Map is shown hereにありますが、plenty to choose fromがあります。

の場合は、直接となります。あなたすることはできません。

class Exposer<T> : T {...} // non-working code to implement the interface T 

をあなたが、しかし、いくつかのクラスを持つことができます。

class Exposer : A, B {...} 

とちょうどキャスト:

A a = Exposer; 
a.Do_A(); 
B b = Exposer; 
b.Do_B(); 
1

Foo<T>が実装(または拡張する)ことができないタイプ実際のTTはコンパイル時に不明です。あなたができることは、Tをプロパティとして公開し、そのメソッドを呼び出すことです。しかし、Ondrejが書いたように、質問は少し不明かもしれません。

1

書き込み時にIoCについて記述していますか?

ObjectFactory.GetInstance<T>().Do_A(); 

キーワードnewを取り除くと、一般的な方法で指定されたインターフェイスのインスタンスを取得取得したい場合は、見てみましょう:あなたのエクスポーザクラスは私がStructureMap APIに考えさせる

Exposer<A>.Do_A(); 

このarticleまたはチェックStructureMap

0

特定のクラスを使用するときに使用するインターフェイスの実装を選択するには、ジェネリックを使用せずにクラスをインターフェイスにキャストします。

public interface A 
{ 
    void Do_A(); 
} 

public interface B 
{ 
    void Do_B(); 
} 

public class Exposer : A, B 
{ 
    public void Do_A() { ; } 
    public void Do_B() { ; } 
} 

public void Main() 
{ 
    // the casts are redundant here, 
    // because the interface implementation 
    // is implicit 

    ((A)Exposer).Do_A(); 
    ((B)Exposer).Do_B(); 
} 

あなたがにしたい場合は、指定されたインタフェースのメンバーのない実装ですメンバー、明示的な実装を使用除外:あなたは完全なサンプルもの完全な定義もない提供

public class Exposer : A, B 
{ 
    void A.Do_A() { ; } 
    void B.Do_B() { ; } 
} 

public void Main() 
{ 
    // the casts are now required; 
    // otherwise, you'll get a compiler error 
    // telling you that the method is inaccessible 

    ((A)Exposer).Do_A(); 
    ((B)Exposer).Do_B(); 
} 
関連する問題