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

在C#中的泛型中强制转换对象-InvalidCast异常,c#,generics,reflection,.net,C#,Generics,Reflection,.net,我制作了一个通用的userControl,给定一个类型T(其中T是一个类),创建一个树,其中包含树中实现T的所有类型(显然是通过反射查找它们)。 树工作正常,但当我尝试实现一个事件,告诉我选择了一个类型时,我得到一个InvalidCastException,或者我的函数不工作,不管我做什么 功能是: void TypeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { if ((typeSelecte

我制作了一个通用的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
typeSelected
的类型为
Action

因此,以这种方式,e.Node.Tag为T在运行时为false,但在我对其设置watch时为true 此外,如果我删除了条件,我将从
(T)e.Node.Tag
中获得异常,尽管手表再次成功地将其强制转换

运行时中的类型是
RuntimeType


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

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

}
void TypeView\u NodeMouseClick(对象发送者,树demouseClickEvenArgs e)
{     
Dowhateveryaftermouseclicked(发送方,e);
}
public void dowhateveraftermouseclick(对象发送方,TreeNodeClickEventArgs e)
{    
如果((typeSelected!=null)&&(e.Node.Tag为T))
所选类型((T)e.Node.Tag);
}

如果e.Node.Tag的类型是T的派生类型,则可能发生这种情况。
如果是这种情况,您应该研究一下

请提供:(1)显示如何声明T的代码(2)确切的错误消息我认为您需要提供将值赋给每个节点的Tag属性的代码。T是在父类上声明的,而且,由于DowhateAftermouseClicked,我看不出这有什么帮助(sender,e);在我需要转换为类型T时使用常量。。。