2012-09-07 20 views
10

I持って、次のクラス/インタフェース:C#Generic Constraint - 現在のクラスの型を参照する方法?

public abstract class AbstractBasePresenter<T> : IPresenter<T> 
    where T : class, IView 
{ 
} 

public interface IPresenter<T> 
{ 
} 

public interface IView<TV, TE, TP> : IView 
    where TV : IViewModel 
    where TE : IEditModel 
    //where TP : AbstractBasePresenter<???> 
{ 
} 

public interface IView {} 

私はAbstractBasePresenterから継承したクラスであることをIViewの<>にTPを制約することができます任意の方法はありますか?

非汎用のIPresenterインターフェイスを作成し、それを実装するためにIPresenterを更新し、 "TP:IPresenter"チェックを使用する唯一の方法は何ですか?

おかげで

アップデート:以下

提案答えは動作しません:

public interface IView<TV, TE, TP> : IView 
where TV : IViewModel 
where TE : IEditModel 
where TP : AbstractBasePresenter<IView<TV,TE,TP>> 
{ 
} 

として、私はインターフェイス宣言を持っている:コンパイラはIInsuredDetailsPresenterがへ割り当てられないと文句を言い

public interface IInsuredDetailsView : IView<InsuredDetailsViewModel, InsuredDetailsEditModel, IInsuredDetailsPresenter> 
{ } 

public interface IInsuredDetailsPresenter : IPresenter<IInsuredDetailsView> 
{ } 

AbstractBasePresenter>

+0

'AbstractBasePresenter'には' T'がありますか? C#には、いくつかの型パラメータが設定されていないジェネリック型のインスタンスの概念はありません。 –

+0

'ここでTP:AbstractBasePresenter >'がコンパイルされますが、あなたが望む結果が得られるかどうかは分かりません... – nemesv

+1

以下の構造は複雑すぎて、できることを理解するのは難しい〜のために役立つ。 – Andrey

答えて

2

あなたはそれを行うことができますが、IView<>インターフェイスにもう一つの型引数を提供する必要があります。

public interface IView<TV, TE, TP, T> : IView 
    where TV : IViewModel 
    where TE : IEditModel 
    where TP : AbstractBasePresenter<T> 
    where T : class, IView 
{ 
} 

編集:

あなたの質問内の版によると:IInsuredDetailsPresenterは間違いなく割り当て可能ではありませんAbstractBasePresenter。コンパイラは、元の質問で要求した制約のために不平を言っています。具体的に起因する、この部分

where TP : AbstractBasePresenter<T> 

にあなたが同様のインタフェースであることをTPを制限したいようです。あなたは、コードの以下の部分を試していない可能性がありますT

public interface IView<TV, TE, TP, T> : IView 
    where TV : IViewModel 
    where TE : IEditModel 
    where TP : IPresenter<T> 
{ 
} 

制約がこれ以上必要とされ、IPresenter<T>は何を持っていないので。もちろん、armen.shimoonの答えを同様の方法で調整することができます。ポイントは、AbstractBasePresenter<T>制約をIPresenter<T>制約に置き換えることです。

+0

コードがコンパイルされません。あなたはどこにいないのですか? 'T:IView' – nemesv

+0

@nemesv:本当にありがとう – pbalaga

+0

4番目のジェネリックパラメータを追加する必要はありません。 –

4

問題ありません、他の一般的なパラメータは必要ありません:

:あなたはAbstractBasePresenterから継承するプレゼンターを必要としない場合

は、にコードを変更します。

public interface IView<TV, TE, TP> : IView 
    where TV : IViewModel 
    where TE : IEditModel 
    where TP : AbstractBasePresenter<IView<TV,TE,TP>> 
{ 
} 

編集:更新質問

public interface IView<TV, TE, TP> : IView 
    where TV : IViewModel 
    where TE : IEditModel 
    where TP : IPresenter<IView<TV,TE,TP>> 
{ 
} 
+0

強力な型サポートを必要としないので、あなたのソリューションは良好です。 (あなたは 'AbstractBasePresenter'の中に' T 'がどんな型であるかあなたは全く制御しません。) – pbalaga

+1

これは動作しません。上記の編集された質問を参照してください。 – Rezler

関連する問題