C# 将复选框或单选按钮传递给方法

C# 将复选框或单选按钮传递给方法,c#,winforms,C#,Winforms,目前,我正在将CB和RD传递给以下方法 public void objEnabled(System.Windows.Forms.RadioButton x, bool enabled) { if (x.InvokeRequired) { BeginInvoke(new MyDelegate(delegate() { x.Checked = enabled;

目前,我正在将CB和RD传递给以下方法

public void objEnabled(System.Windows.Forms.RadioButton x, bool enabled)
    {
        if (x.InvokeRequired)
        {
            BeginInvoke(new MyDelegate(delegate()
            {
                x.Checked = enabled;
            }));
        }
        else
        {
            x.Checked = enabled;
        }
    }

    public void objEnabled(System.Windows.Forms.CheckBox x, bool enabled)
    {
        if (x.InvokeRequired)
        {
            BeginInvoke(new MyDelegate(delegate()
            {
                x.Checked = enabled;
            }));
        }
        else
        {
            x.Checked = enabled;
        }
    }
但是我想做如下的事情

public void objChecked(Control x, bool enabled)
    {
        if (x.InvokeRequired)
        {
            BeginInvoke(new MyDelegate(delegate()
            {
                x.Checked = enabled;
            }));
        }
        else
        {
            x.Checked = enabled;
        }
    }

我可以使用类似的东西来更改.Text、.Visible和.Enable。但是.Checked不是控件类的一部分。

控件x
转换为所需的类型:例如,
(System.Windows.Forms.RadioButton)x
将x从
控件转换为
系统.Windows.Forms.RadioButton
。然后您应该能够访问它的checked属性


我认为System.Windows.Forms没有包含
Checked
属性的基类,因此您需要将控件强制转换为已选中
的特定实现

    public void objChecked(Control c, bool enabled)
    {
        RadioButton x = c as RadioButton;
        if(x == null)
            throw new ArgumentException();
        if (x.InvokeRequired)
        {
            BeginInvoke(new MyDelegate(delegate()
            {
                x .Checked = enabled;
            }));
        }
        else
        {
            x.Checked = enabled;
        }
    }
delegate void MyDelegate(object control, object enabled);
public void objChecked(Control x, bool enabled)
{
    System.Reflection.PropertyInfo pi = x.GetType().GetProperty("Checked");

    if (pi != null && pi.PropertyType == System.Type.GetType("System.Boolean"))
    {
        if (x.InvokeRequired)
            BeginInvoke(new MyDelegate(pi.SetValue), new object[] { x, enabled });
        else
            pi.SetValue(x, enabled);
    }
}

Checked属性不是接口的一部分,因此不能具有“通用”功能。它们在单选按钮和复选框中分别定义

如果您希望将它们视为一个,那么可以使用dynamic关键字让运行时了解它们

public void objChecked(Control x, bool enabled)
    {
        if(x as RadioButton == null && x as CheckBox == null)
          throw new Exception("Not supported");


        dynamic runtimeObject = (dynamic)x;
        if (x.InvokeRequired)
        {
            BeginInvoke(new MyDelegate(delegate()
            {
                runtimeObject.Checked = enabled;
            }));
        }
        else
        {
            runtimeObject.Checked = enabled;
        }
    }

您需要检查类型并相应地强制转换它

if (x is System.Windows.Forms.RadioButton)
    (x as System.Windows.Forms.RadioButton).Checked = enabled;
else if (x is System.Windows.Forms.CheckBox)
    (x as System.Windows.Forms.CheckBox).Checked = enabled;

只是出于好奇,不推荐-其他可能性,无需铸造:

    public void objChecked(Control c, bool enabled)
    {
        Expression property
            = Expression.Property(Expression.Constant(c), "Checked");
        var lambda = Expression.Lambda<Action>(
                         Expression.Assign(
                             property,
                             Expression.Constant(enabled)))
                     .Compile();

         if (c.InvokeRequired)
         {
             BeginInvoke(new MyDelegate(delegate()
                 {
                     lambda.Invoke();
                 }));
         }
         else
         {
             lambda.Invoke();
         }
    }
public void objChecked(控件c,bool已启用)
{
表达式属性
=表达式属性(表达式常数(c),“已检查”);
var lambda=表达式.lambda(
表达式.赋值(
财产,,
表达式(常量(已启用)))
.Compile();
如果(c.invokererequired)
{
BeginInvoke(新的MyDelegate(delegate())
{
lambda.Invoke();
}));
}
其他的
{
lambda.Invoke();
}
}

使用反射。将适用于名为
已选中的布尔属性的任何控件

delegate void MyDelegate(object control, object enabled);
public void objChecked(Control x, bool enabled)
{
    System.Reflection.PropertyInfo pi = x.GetType().GetProperty("Checked");

    if (pi != null && pi.PropertyType == System.Type.GetType("System.Boolean"))
    {
        if (x.InvokeRequired)
            BeginInvoke(new MyDelegate(pi.SetValue), new object[] { x, enabled });
        else
            pi.SetValue(x, enabled);
    }
}

当您从后台线程(因此是
BeginInvoke
)检查类似内容时,听起来像是一个设计问题。@UweKeim这是一个自动机器界面,需要显示从串口接收事件接收到的IO控制板响应的视觉统计信息。当您无法设想winform上使用项的所有可能原因时,千万不要认为这是一个设计问题。