2016-05-17 1 views
2

ToolStripMenuItemおよび基本タイプControlには、いずれもプロパティEnabledが含まれています。ToolStripMenuItemとControlの両方に共通のベース?

EnableItems(multipleItems);などの関数に両方の型を渡す必要がありますが、Enabledプロパティを含む共通のベースを見つけることができません。

LabelまたはLinkLabelは、Controlから継承します(通常、「有効にしない」から「有効にする」に切り替えるタイプです)。

C#のすぐに使用できる機能でこれを行う方法はありますか?

+0

ランタイムでダイナミックがサポートされていない場合は、リフレクション用の構文シュガーとなります。 リフレクションを使用して、名前でプロパティを設定する方法(または例外を取得する方法:-))を参照してください。http://stackoverflow.com/questions/619767/set-object-property-using-reflection – vitalygolub

答えて

2

ダイナミックタイプを使用してください。これは、コンパイラがあなたを信頼できるようにします。誤って使用すると実行時に例外が出る可能性がありますが、注意しても問題はありません。

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

有効または無効にしたいものを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ループをしたい場合は、今選ぶことができるか、無視することを選択することができます予期しないタイプ。

関連する問題