C# ToolStripMenuItem和Control的共享基础?

C# ToolStripMenuItem和Control的共享基础?,c#,.net,winforms,C#,.net,Winforms,ToolStripMenuItem和基类型Control都包含属性Enabled 我需要将这两种类型传递给函数,例如EnableItems(multipleItems),但我找不到包含Enabled属性的公共基 Label或LinkLabel继承自Control(通常是我要从“未启用”切换到“已启用”的类型) c#中的开箱即用功能是否有办法做到这一点?使用动态类型。它允许您使编译器信任您。如果您误用它,它可以提供运行时示例,但是如果您小心,就不会有问题 public static vo

ToolStripMenuItem
和基类型
Control
都包含属性
Enabled

我需要将这两种类型传递给函数,例如
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;
        }
    }
公共静态无效启用(列表CTR、bool启用)
{
foreach(在ctr中的var ctr)
{
动态a=ctr;
a、 启用=启用;
}
}

将您想要启用或取消的内容传递给它。如果没有enable属性,它将在运行时崩溃,因此要小心,如果不想使用动态类型,则同时使用和继承基类。因此,您可以将其用作列表类型:

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; }
    }
}
公共作废启用项(IList cpnts)
{
foreach(cpnt中的组件cpnt)
{
ToolStripItem tsItem=cpnt作为ToolStripItem;
如果(tsItem!=null){tsItem.Enabled=true;break;}
控件ctrl=cpnt作为控件;
如果(ctrl!=null){ctrl.Enabled=true;break;}
}
}

现在,您可以选择是希望foreach循环在运行时崩溃(通过为意外类型添加异常抛出),还是选择忽略意外类型。

如果您的运行时不支持动态,则反射的语法很重要。请参见此问题,如何使用反射按名称设置属性(或获取异常:-))