【问题标题】:How do you determine the actual type of a ToolStripItem in C#如何确定 C# 中 ToolStripItem 的实际类型
【发布时间】:2011-07-31 09:38:01
【问题描述】:

我正在将 VB.Net 应用程序转换为 C#。其他一切都很好。除了这一点。我有一个从数据库构建菜单、子菜单和分隔符的功能。它可以构建一个 MenuStrip 或一个 ContextMenuStrip,然后可以将其分配给一个表单。

这意味着菜单可以是广泛的和 conpmex,但在应用程序之外进行管理,我也将其用作我的安全访问模型的一部分。所有菜单都由外部数据库控制,这也意味着我可以开发可视化工具(树视图等)来管理用户菜单。该应用程序广泛使用菜单,这是设计使然。

我想以编程方式为每个不是下拉列表或分隔符的项目分配一个事件处理程序

在 VB 中我会这样做,(完美运行)

Private Sub AddHandlers (ByVal voMenuItems As ToolStripItemCollection)

For Each oItem in voMenuItems
    If TypeOf(oItem) is ToolStripDropDown then
        if oItem.DropDownItems.Count > 0 then
            AddHandlers(oItem.DropDownItems)
        Else
            AddHandler oItem.Click, AddressOf ToolBarButtonClick
        End If
    End If
Next

End Sub

Private Sub ToolbarButtonClick(ByVal sender As System.Object, ByVal e As System.EventArgs)

'Do something

End Sub

但是我如何在 C# 中实现同样的目标

我必须像这样编写我的循环

foreach (ToolStripItem oItem in voMenuItems)

它总是返回一个 ToolStripItem(使用 GetType 或 typeof),我找不到任何方法来确定 ToolStripItem 实际是的项目类型(ToolStripDropDown 或 ToolStripSeperator),即使那样我也无法转换为类型我想要的,例如

(ToolStripDropDown)oItem.DropDownItems.Count ...

这会产生编译时错误

“System.Windows.Forms.ToolStripItem”不包含“DropDownItems”的定义,并且找不到接受“System.Windows.Forms.ToolStripItem”类型的第一个参数的扩展方法“DropDownItems”(您是否缺少using 指令还是程序集引用?)"

【问题讨论】:

  • 由于运算符优先级规则,强制转换不起作用,点运算符比强制转换运算符“更强”。需要括号:((ToolStripDropDown)oItem).DropDownItems.Count。见stackoverflow.com/questions/4022377/…

标签: c# vb.net


【解决方案1】:

您可以选择以下两种方式之一:

ToolStripDropDown tsdd = oItem as ToolStripDropDown
if (tsdd != null)
{
}

'as' 强制转换如果不起作用,将返回 null,或者您可以这样做:

try
{
    ToolStripDropDown tsdd = (ToolStripDropDown)oItem;
}
catch
{
    // Do something ...
}

还要检查对象的类型:

bool isToolStripDropDown = oItem is ToolStripDropDown;

或:

bool isToolStripDropDown = oItem.GetType() == typeof(ToolStripDropDown);

【讨论】:

    【解决方案2】:

    您可以使用 foreach 提及 Object 类型或匿名类型,如下所示:

    foreach (object oItem in voMenuItems)
    ...
    if(typeof(oItem) == ... )
    ...
    
    或者
    foreach(var oItem in voMenuItems)
    ...
    

    如果 typeof 没有返回您希望尝试的类型,请使用 'as' 进行强制转换并检查返回的对象是否为 null

    if(oItem as ToolstripDropDown != null)
    ....
    

    【讨论】:

      【解决方案3】:

      您可以使用is 关键字。

      所以,

      If TypeOf(oItem) is ToolStripDropDown (VB)

      变成

      if (oItem is ToolStripDropDown) (C#)

      您可能还想查看 as 关键字,它允许您尝试强制转换为类型,但如果无法转换则返回 null。

      【讨论】:

        【解决方案4】:

        在 VB 中我可以做到

        oItem.GetType.ToString
        

        所以在这段代码中:

                            Dim tmenu As New ToolStripMenuItem(menu.Name)
                            ASRMenus.DropDownItems.Insert(mPosition, tmenu)
                            Dim t As ToolStripItem = CType(tmenu, ToolStripItem)
        
        

        在调试器中询问这个

        ?t.GetType.tostring
        

        给了“System.Windows.Forms.ToolStripMenuItem”

        【讨论】:

          猜你喜欢
          • 2013-03-31
          • 1970-01-01
          • 2013-07-22
          • 2021-10-25
          • 1970-01-01
          • 1970-01-01
          • 2018-05-27
          • 2015-07-31
          • 2021-03-04
          相关资源
          最近更新 更多