2016-05-17 103 views
2

ToolStripMenuItem和基本類型Control都包含屬性EnabledToolStripMenuItem和Control共享基礎?

我需要將這兩種類型傳遞給函數,如EnableItems(multipleItems);,但我無法找到包含Enabled屬性的公共基礎。

LabelLinkLabel繼承自Control(這通常是我想要從「未啓用」切換到「已啓用」的類型)。

有什麼辦法可以做到這一點與開箱即用的功能在C#中?

+0

如果您的運行時不支持動態,它是反射的語法糖 看到這個問題,如何設置屬性的名稱(或得到異常:-)),使用反射http://stackoverflow.com/questions/619767 /設定對象屬性,使用反射 – vitalygolub

回答

2

使用動態類型。它允許你讓編譯器信任你。如果你濫用它,它可以給運行時免除,但如果你小心,沒有問題。

public static void Enable(List<object> ctrs, bool enable) 
    { 
     foreach (var ctr in ctrs) 
     { 
      dynamic a=ctr; 
      a.Enabled = enable; 
     } 
    } 

將它傳遞給任何你想啓用或disble的llist。如果它沒有啓用屬性,它將在運行時崩潰,因此請謹慎

1

如果您不想使用動態類型,那麼ControlToolStripMenuItem都將繼承基類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循環在運行時崩潰(通過添加一個意想不到的類型異常拋出),也可以選擇忽略意外類型。