我有下面的类,它包含两个数组: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>
,因为Checkboxes
和Radiobuttons
是控件
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;
}
}
}
RadioButton
和CheckBox
类都继承自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;
}
}