我正在研究访问控制列表,其中我必须根据分配的角色显示/隐藏菜单项。我已经通过 TAG 参考了每个菜单项。现在我有一个存储所有标签名称的数组。
是否有可能我只是循环通过标记名称数组并仅通过标记或名称引用菜单项控件而不循环通过所有 menuStrip 项并比较当前控件并使其可见?
谢谢
我正在研究访问控制列表,其中我必须根据分配的角色显示/隐藏菜单项。我已经通过 TAG 参考了每个菜单项。现在我有一个存储所有标签名称的数组。
是否有可能我只是循环通过标记名称数组并仅通过标记或名称引用菜单项控件而不循环通过所有 menuStrip 项并比较当前控件并使其可见?
谢谢
我不完全了解您要实现的目标,但也许这段代码对您有所帮助:
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;
}
}
注意this
必须是包含菜单的Form。