2011-07-14 117 views
0

我有一个通用的用户控件我做了,给定一个类型T(其中T是一个类),创建一个树所有的树(显然找到他们实行T中的类型与反射)。 树工作正常,但当我试图实现一个事件,告诉我一个类型被选中,我得到一个InvalidCastException,或者我的函数不起作用,无论我做什么。铸造对象 - InvalidCast异常

的功能是:

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

e.Node.Tag有一个对象,它是真的类型T typeSelected是类型Action<T>

所以以这种方式的,e.Node.Tag是T是在运行时为false,但如果我在上设置了手表,那么也是如此,如果我从(T)e.Node.Tag中删除了条件为Im的异常,但手表仍能成功投射它。

在运行时类型为RuntimeType ....

那么,为什么会出现这种情况,而且我怎么能解决呢?

+1

请提供:(1)代码(2)确切的错误消息 –

+0

我认为您需要提供代码将值分配给每个节点的Tag属性的代码。 –

回答

0

您还没有通过分配一个值T.你要通过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 (sender,e);使用常量,而我需要转换为类型T ... – Shahar