C# 如何通过标签或名称引用菜单项

C# 如何通过标签或名称引用菜单项,c#,toolstripmenu,C#,Toolstripmenu,我正在处理访问控制列表,其中我必须根据分配的角色显示/隐藏菜单项。我已经通过标签引用了每个菜单项。现在我有一个数组存储所有标记名 我是否可以只循环遍历标记名数组,只按标记或名称引用菜单项控件,而不循环遍历所有菜单项,比较当前控件并使其可见 谢谢我不太明白您到底想实现什么,但这段代码可能对您有所帮助: private void button1_Click(object sender, EventArgs e) { var menus = new string[] { "Ev

我正在处理访问控制列表,其中我必须根据分配的角色显示/隐藏菜单项。我已经通过标签引用了每个菜单项。现在我有一个数组存储所有标记名

我是否可以只循环遍历标记名数组,只按标记或名称引用菜单项控件,而不循环遍历所有菜单项,比较当前控件并使其可见


谢谢

我不太明白您到底想实现什么,但这段代码可能对您有所帮助:

    private void button1_Click(object sender, EventArgs e) {
        var menus = new string[] { "Every", "menu", "you", "want", "to", "show" };
        foreach (var mnu in this.GetType().GetFields(
            BindingFlags.Instance | 
            BindingFlags.NonPublic | 
            BindingFlags.GetField)) {
            var member = mnu.GetValue(this) as MenuStrip;
            if (null != member) {
                member.Visible = (menus.Contains(member.Tag.ToString()));
            }
        }
    }

我想我现在更明白了。下面的代码将
ToolStripMenuItem
变为可见(或更改为对象的任何类型)。我使用名称,因为要使用标记,必须枚举所有对象

    private void ShowItem(string menuItemName) {
        var field = this.GetType().GetField(
            menuItemName, 
            BindingFlags.Instance |
            BindingFlags.NonPublic |
            BindingFlags.GetField);
        var mnu = field.GetValue(this) as ToolStripMenuItem;
        if (null != mnu) {
            mnu.Visible = true;
        }
    }

请注意,
必须是包含菜单的表单。

好的,然后根据您的需要调整上述代码。顺便说一句,它使用System.Reflection和System.Linq。您可以省略
菜单
变量,只需与所需的特定标记进行比较。var member=mnu.GetValue(this)作为MenuStrip;它总是以空值出现。我就不能叫会员。标签吗?我可以看到Name属性,但不能看到Tag。我也会在第n级搜索子级?如果您正在枚举ToolsCrimmenuItems:是。