2011-07-14 13 views
0

私は汎用型のuserControlを持っています.T型(Tはクラスです)では、ツリー内にTを実装するすべての型を持つツリーを作成しますリフレクション付き)。 ツリーは正常に動作しますが、タイプが選択されたことを通知するイベントを実装しようとしたとき、InvalidCastExceptionを取得したか、自分の機能が機能しなくなってしまいました。C#でジェネリックのオブジェクトをキャスト - InvalidCast例外

関数である。したがって、このようにして、e.Node.TagはTであるe.Node.Tag

void TypeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) 
{ 
     if ((typeSelected != null) && (e.Node.Tag is T)) 
      typeSelected((T)e.Node.Tag) 
} 

タイプT typeSelected本当にあるオブジェクトがあるタイプAction<T>

のものです実行時にはfalseですが、時計を設定すると、 もtrueになります。例外の取得を取り除くと、(T)e.Node.Tagから例外が発生しますが、時計はキャストに成功します。ランタイムで

タイプはRuntimeTypeです....

そうですが、なぜでしょう、そしてどのように私はそれを解決できますか?

+1

になるはずですしてください:(1)コードこと(2)正確なエラーメッセージ –

+0

各ノードのTagプロパティに値を割り当てるコードを提供する必要があると思います。 –

答えて

0

あなたはTに値を割り当てていません。メソッドのシグネチャ内のメソッドには、イベントハンドラではなくTの汎用割り当てを渡す必要があります。この場合e.Node.TagのタイプはT. の派生型である場合、これが発生する可能性が

void TypeView_NodeMouseClick(object sender, TreeNodeMouseClickEvenArgs e) 
{  
    DoWhateverAfterMouseClicked<string>(sender, e);  
} 

public void DoWhateverAfterMouseClicked<T>(object sender, TreeNodeClickEventArgs e) 
{  
      if ((typeSelected != null) && (e.Node.Tag is T)) 
        typeSelected((T)e.Node.Tag); 

} 
+0

親クラスでTが宣言されていない限り、 –

+0

Tは親クラスで宣言されていますが、DoWhateverAfterMouseClicked (送信者、e)以降、これがどのように役立つかわかりません。私はタイプTにキャストする必要がありますが定数を使用しています... – Shahar