在C#中的泛型中转换对象 - InvalidCast Exception

时间:2011-07-14 08:05:26

标签: c# generics reflection .net

我有一个通用的userControl,给定一个Type 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类型的对象 typeSelected的类型为Action<T>

所以这样,e.Node.Tag在运行时T是假的,但是当我设置监视时它是真的 另外,如果我删除条件我从(T)e.Node.Tag获得例外,虽然再一次,手表成功投射它。

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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);

}