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