c#中的泛型对象强制转换- InvalidCast异常



我有一个通用的userControl,给定类型T(其中T是一个类),创建一个树,其中包含在树中实现T的所有类型(显然通过反射找到它们)。这棵树工作得很好,但是当我试图实现一个告诉我类型被选中的事件时,我得到一个InvalidCastException,或者无论我做什么,我的函数都不起作用。

函数是:

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

e.Node.Tag中存在一个真正属于T类型的对象typeSelectedAction<T>

所以在这种方式下,e.m ode. tag is T在运行时为假,但当我在它上设置watch时为真此外,如果我删除条件,我将从(T)e.Node.Tag获得异常,尽管手表再次成功地强制转换了它。

运行时的类型是RuntimeType ....

那么为什么会发生这种情况,我该如何解决它?

如果e.Node.Tag的类型是T的派生类型,则可能发生这种情况。如果是这种情况,您应该查看variant &协变

您还没有给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);
}

相关内容

  • 没有找到相关文章

最新更新