ToolStripMenuItem
和基本類型Control
都包含屬性Enabled
。ToolStripMenuItem和Control共享基礎?
我需要將這兩種類型傳遞給函數,如EnableItems(multipleItems);
,但我無法找到包含Enabled
屬性的公共基礎。
Label
或LinkLabel
繼承自Control
(這通常是我想要從「未啓用」切換到「已啓用」的類型)。
有什麼辦法可以做到這一點與開箱即用的功能在C#中?
ToolStripMenuItem
和基本類型Control
都包含屬性Enabled
。ToolStripMenuItem和Control共享基礎?
我需要將這兩種類型傳遞給函數,如EnableItems(multipleItems);
,但我無法找到包含Enabled
屬性的公共基礎。
Label
或LinkLabel
繼承自Control
(這通常是我想要從「未啓用」切換到「已啓用」的類型)。
有什麼辦法可以做到這一點與開箱即用的功能在C#中?
使用動態類型。它允許你讓編譯器信任你。如果你濫用它,它可以給運行時免除,但如果你小心,沒有問題。
public static void Enable(List<object> ctrs, bool enable)
{
foreach (var ctr in ctrs)
{
dynamic a=ctr;
a.Enabled = enable;
}
}
將它傳遞給任何你想啓用或disble的llist。如果它沒有啓用屬性,它將在運行時崩潰,因此請謹慎
如果您不想使用動態類型,那麼Control和ToolStripMenuItem都將繼承基類System.ComponentModel.Component。所以,你可以使用它作爲您的列表類型:
public void EnableItems(IList<Component> cpnts)
{
foreach (Component cpnt in cpnts)
{
ToolStripItem tsItem = cpnt as ToolStripItem;
if (tsItem != null) { tsItem.Enabled = true; break; }
Control ctrl = cpnt as Control;
if (ctrl != null) { ctrl.Enabled = true; break; }
}
}
您現在可以選擇,如果你想在foreach循環在運行時崩潰(通過添加一個意想不到的類型異常拋出),也可以選擇忽略意外類型。
如果您的運行時不支持動態,它是反射的語法糖 看到這個問題,如何設置屬性的名稱(或得到異常:-)),使用反射http://stackoverflow.com/questions/619767 /設定對象屬性,使用反射 – vitalygolub