2016-08-14 11 views
0

このようなものです。new()に応じて汎用メソッドを呼び出す方法

class C1<T> : I1<T> where T:class{ 
    void M1() {} 
} 
class C2<T> : I1<T> where T:class,new(){ 
    void M2() {} 
    void irrelevant_method{ ... new T(); ... } 
} 
class C3<T> where T:class { 
    void M3(I1<T> x){ 
    // how to call M1 or M2? 
    if (x is C1<T>) (x as C1<T>).M1(); 
    else if (x is C2<T>) (x as C2<T>).M2(); // error 
    } 
} 

私たちはコンパイラが知りません。 xC2の場合、new()という制約がありますが、C3にはnew()がないため、xを「宣伝できません」。

いいえ、私はnew()を追加できません。私は本当にデフォルトのctorのないクラスを扱わなければなりません。

アイデア?


編集:新しいT()を使用して無関係なメソッドを追加しましたが、問題とは何の関係もありません。


質問はない重複しているが、答えは同じであるが判明しました。実行時にnew()制約を取り除き、Activator.CreateInstance<T>()を使用してください。リンクありがとう。

+1

反射はあなたのためのオプションすることができますか? – aprovent

+2

私はそのコードの 'T'にコンストラクタコールを見ません:私はそれが赤ちゃんだと思います。 *正確に*あなたが得ているエラーメッセージです。また、ifsの内容を別々の行に入れて、エラーを述語と制御文とで明確に区別できるようにします。 – Richard

+1

'xがC2 'であることを指摘したのは、最初のエラーです。この周りに簡単な方法はありません、あなたは2番目の拘束されたT2を必要とし、それは混乱を使用します。ベットの答え:リファクタントC3を2つの特殊なクラスに分けます。 –

答えて

-1

は、あなたがこのようsomethink使用すべきである場合があります。

interface I1<T> 
    { 
     void Some(); 
    } 

    class C1<T> : I1<T> where T:class{ 
     public void M1() {} 

     public void Some() 
     { 
     } 
    } 
    class C2<T> : I1<T> where T:class{ 
     public void M2() {} 
     public void Some() 
     { 
     } 
    } 
    class C3<T> where T:class { 
     void M3(I1<T> x){ 
      if (x is C1<T>) (x as C1<T>).M1(); 
      else if (x is C2<T>) (x as C2<T>).M2(); 
     } 

     public void Some() 
     { 
     } 
    } 
+2

あなたは正しい例ですが、質問は 'T:class'と' T:class、new() 'の組み合わせに関するものと思います。 – aprovent

+1

@mixim:どのように役立ちますか? new()制約を削除しました。 –

関連する問題