Windows窗体c#扩展类



我有下面的类,它包含两个数组:RadioButton[]和Checkbox[]。我只需要一次显示其中一个。由于我需要多次执行此操作,因此我考虑将扩展方法变为可见,以便优雅地执行此操作。

public class AnswerForm
    {
        public RadioButton[] rbuttons { get; set; }
        public CheckBox[] checkboxes { get; set; }    
    }
public static class FormExtension
{
    public static void Visible(this Form[] elem, bool state)
    {
        foreach (var item in elem)
            item.Visible = state;
    }
}

但是当我尝试调用

answerForm.rbuttons.Visible(true);

扩展方法无法识别。它们都在同一个命名空间中,所以不可能是include错误或类似的错误。

您的extensionmethod想要一个Form[],而rbuttons的数组类型是RadioButton

static class FormExtension
{
    public static void Visible(this Control[] elem, bool state)
    {
        foreach (var item in elem)
            item.Visible = state;
    }
}

将其更改为上面的示例,其中类型为Control[],将允许RadioButton[]CheckBox[]同时使用extension方法;还有其他的控制

如果你想更具体地禁止使用某些控件类型,将其更改为ButtonBase[];RadioButton和CheckBox都继承自ButtonBase。

ReSharper实际上给了我一个以上解决方案的警告,因为它可能导致runtimerrors: "协变数组从RadioButton[]转换到ButtonBase[]可能导致写操作的运行时异常"。

下面的溶液消除了它。同样,它也可以更改为Control。

public static void Visible<T>(this IEnumerable<T> elem, bool state) where T: ButtonBase
{
    foreach (var item in elem)
        item.Visible = state;
}

最后注意,我已将数组更改为IEnumerable。这扩展了用法;

将可视方法参数从Form更改为IEnumerable<Control>,因为CheckboxesRadiobuttons是控件

public class AnswerForm
    {
        public RadioButton[] rbuttons { get; set; }
        public CheckBox[] checkboxes { get; set; }
    }
    public static class FormExtension
    {
        public static void Visible(this IEnumerable<Control> elem, bool state)
        {
            foreach (var item in elem)
            {
                item.Visible = state;
            }
        }
    }

RadioButtonCheckBox类都继承自System.Windows.Forms.ButtonBase:

public class AnswerForm
{
    public RadioButton[] rbuttons { get; set; }
    public CheckBox[] checkboxes { get; set; }    
}
static class FormExtension
{
    public static void Visible(this ButtonBase[] elem, bool state)
    {                            // ^^^^^^^^^^^^
        foreach (var item in elem)
            item.Visible = state;
    }
}

最新更新