我正在将VB.Net应用程序转换为C#。其他一切都很棒。除了这一点。我有一个功能,可以从数据库中构建菜单,子菜单和分隔符。它可以构建一个MenuStrip或ContextMenuStrip,然后可以将其分配给表单。
这意味着菜单可以是广泛的和conpmex,但在应用程序之外进行管理,我也将其用作安全访问模型的一部分。所有菜单都是从外部数据库控制的,这也意味着我可以开发可视化工具(Treeviews等)来管理用户菜单。该应用程序广泛使用菜单设计。
以编程方式我想为每个不是下拉列表或分隔符的项目分配一个事件处理程序
在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'的定义,并且没有扩展方法'DropDownItems'接受类型'System.Windows.Forms.ToolStripItem'的第一个参数可以找到(你错过了吗?) using指令或程序集引用?)“
答案 0 :(得分:2)
您可以采取以下两种方式之一:
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);
答案 1 :(得分:1)
您可以使用foreach提及Object类型或匿名类型,如下所示:
foreach (object oItem in voMenuItems)
...
if(typeof(oItem) == ... )
...
要么
foreach(var oItem in voMenuItems)
...
如果typeof没有返回您希望的类型,可以尝试使用'as'进行转换并检查返回的对象是否为null
if(oItem as ToolstripDropDown != null)
....
答案 2 :(得分:0)