【问题标题】:Casting object in generics in C# - InvalidCast Exception在 C# 中的泛型中转换对象 - InvalidCast 异常
【发布时间】:2011-07-14 08:05:25
【问题描述】:

我有一个通用的 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.Node.Tag is T 在运行时为假,但当我对其设置 watch 时为真 另外,如果我删除条件,我会从(T)e.Node.Tag 获得异常,尽管手表再次成功投射它。

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

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

【问题讨论】:

  • 请提供:(1)显示T如何声明的代码(2)确切的错误信息
  • 我认为您需要提供将值分配给每个节点的 Tag 属性的代码。

标签: c# generics reflection .net


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您尚未为 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);
    
    }
    

    【讨论】:

    • T 是在父类上声明的,而且,我看不出这有什么帮助,因为 DoWhateverAfterMouseClicked(sender, e);使用常量 而我需要转换为类型 T...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    相关资源
    最近更新 更多