我有一个通用的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
....
为什么会发生这种情况,我该如何解决?
答案 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);
}