我有一个通用的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<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);
}