2009-07-24 14 views
0

未解決のシンボルとしてTを示しています、私はそれを呼び出す抽象クラスmyClassを渡します。私のMYTYPEクラスでそうはのは、私がこれを持っているとしましょう

、私が持っている:

public void myMethod(object caller) 

私の質問があり、私はそれを呼ばれる抽象クラスの型にオブジェクトの発信者をキャストしますか?

私は

(myClass<T>) 

(myClass) 

を試してみましたが、両方に失敗しました。

ジェネリックスが頭を痛めます。

+0

「再帰的な」Ob がある理由はありますか?T:Ob ?私はそれの背後にいくつかの良い理由を知って興味があります。 – Mank

+0

は私がそのコードを継承し、 – Matt

答えて

3

次のようにあなたは、としてでこれを行うことができます。

public void MyMethod(myClass<T> caller) 
{ 
    // Use caller directly... 
} 

public void MyMethod(object caller) 
{ 
    myClass<T> test = caller as myClass<T>; 
    if (test != null) 
    { 
     // Use test here 
    } 
} 

を言って、あなたが常におそらく使用するクリーナーがあると思いmyClass<T>知らに渡している場合は、


編集:実証するために、ここに小さなサンプルです:

using System; 

public class myClass<T> where T : new() 
{ 
    public T Value; 

    public void CopyFromSecond(object caller) 
    { 
     myClass<T> test = caller as myClass<T>; 
     this.Value = test.Value; 
    } 
} 
class Program 
{ 
    static void Main(string[] args) 
    { 
     myClass<int> test = new myClass<int> { Value = 3 }; 
     myClass<int> test2 = new myClass<int> { Value = 5 }; 

     Console.WriteLine(test.Value); 
     test.CopyFromSecond(test2); 
     Console.WriteLine(test.Value); 
     Console.ReadKey(); 
    } 
} 

これは、期待どおりに3と5を出力します。


編集2:

あなたが別のmyClass<T>からTの種類を見つけるためにしようとしている場合は、リフレクションを使用する必要があります。必要な方法はType.GetGenericTypeDefinitionです。

+0

'as'を使用する場合、私はまだTをmyClassから説明するエラーを受け取りますは定義されていません – Matt

+0

彼の問題は彼が_another_クラスからやっていることです、そのメソッドはいくつか 'myClass 'そして彼は「T」を見つけたいと思っている。 –

+0

@Pavel:私は彼が何を望んでいるかは100%確信していませんが、サンプルコードを追加しました。また、型の取得に必要なTypeメソッドにリンクしました。もし彼の望みに合っていれば、 。 –

0

キャストが最初に必要なのはなぜですか?おそらく、あなたは欲しい:

public void myMethod<T>(myClass<T> caller) 

そうでない場合は、あなたの質問への答えはある - あなたがすることはできません、あなたはあなたを呼ばれるmyClassの特定のどの専門わからないので。

+0

良い点:-)自分のことを理解しようとしていたが、 に 公共ボイドが(MyClassの呼び出し側) Tがまだ有効ではありませんがMyMethodは。 – Matt

+0

ああ、なぜですか?この宣言では、新しいジェネリック型パラメータが導入されています。 'myMethod'の後に' 'を見逃していませんか?あなたがしていない、まだコンパイルされていない場合は、エラーメッセージは何ですか? –

関連する問題