このようなものです。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
}
}
私たちはコンパイラが知りません。 x
がC2
の場合、new()
という制約がありますが、C3にはnew()
がないため、xを「宣伝できません」。
いいえ、私はnew()を追加できません。私は本当にデフォルトのctorのないクラスを扱わなければなりません。
アイデア?
編集:新しいT()を使用して無関係なメソッドを追加しましたが、問題とは何の関係もありません。
質問はない重複しているが、答えは同じであるが判明しました。実行時にnew()
制約を取り除き、Activator.CreateInstance<T>()
を使用してください。リンクありがとう。
反射はあなたのためのオプションすることができますか? – aprovent
私はそのコードの 'T'にコンストラクタコールを見ません:私はそれが赤ちゃんだと思います。 *正確に*あなたが得ているエラーメッセージです。また、ifsの内容を別々の行に入れて、エラーを述語と制御文とで明確に区別できるようにします。 – Richard
'xがC2'であることを指摘したのは、最初のエラーです。この周りに簡単な方法はありません、あなたは2番目の拘束されたT2を必要とし、それは混乱を使用します。ベットの答え:リファクタントC3を2つの特殊なクラスに分けます。 –