publicstaticclass ExtensionControl
{                                               
    publicstaticobject GetPropertySafe(this Control control, string propertyName)
    {
        object returnValue = null;
        Action func = () =>
        {
            Type type = control.GetType();
            returnValue = type.InvokeMember(propertyName, BindingFlags.GetProperty, null, control, null);
        };
        if (control.InvokeRequired)
        {
            control.Invoke(func);
        }
        else
        {
            func();
        }
        return returnValue;
    }
 
    publicstaticobject SetPropertySafe(this Control control, string propertyName, object value)
    {
        object returnValue = null;
        Action func = () =>
        {
            Type type = control.GetType();
            returnValue = type.InvokeMember(propertyName, BindingFlags.SetProperty, null, control, newobject[] { value });
        };
        if (control.InvokeRequired)
        {
            control.Invoke(func);
        }
        else
        {
            func();
        }
        return returnValue;
    }
 
    publicstaticobject GetPropertySafe(this ToolStripMenuItem control, string propertyName)
    {
        object returnValue = null;
        Control owner = control.Owner;
        Action func = () =>
        {
            Type type = control.GetType();
            returnValue = type.InvokeMember(propertyName, BindingFlags.GetProperty, null, control, null);
        };
        if (owner.InvokeRequired)
        {
            owner.Invoke(func);
        }
        else
        {
            func();
        }
        return returnValue;
    }
 
    publicstaticobject SetPropertySafe(this ToolStripMenuItem control, string propertyName, object value)
    {
        object returnValue = null;
        Control owner = control.Owner;
        Action func = () =>
        {
            Type type = control.GetType();
            returnValue = type.InvokeMember(propertyName, BindingFlags.SetProperty, null, control, newobject[] { value });                
        };
        if (owner.InvokeRequired)
        {
            owner.Invoke(func);
        }
        else
        {
            func();
        }
        return returnValue;
    }        
 
    publicstaticobject InvokeMethodSafe(this Control control, string methodName, paramsobject[] args)
    {
        object returnValue = null;
        if (args == null)
        {
            args = newobject[1];
            args[0] = null;
        }
        elseif (args != null && args.Length == 0)
        {
            args = null;
        }
        Action func = () =>
        {
            Type type = control.GetType();                
            returnValue = type.InvokeMember(methodName, BindingFlags.InvokeMethod, null, control, args);
        };
        if (control.InvokeRequired)
        {
            control.Invoke(func);
        }
        else
        {
            func();
        }
        return returnValue;
    }
 
    publicstaticobject InvokeMethodSafe(this ToolStripMenuItem control, string methodName, paramsobject[] args)
    {
        object returnValue = null;
        if (args == null)
        {
            args = newobject[1];
            args[0] = null;
        }
        elseif (args != null && args.Length == 0)
        {
            args = null;
        }
        Control owner = control.Owner;
        Action func = () =>
        {
            Type type = control.GetType();
            returnValue = type.InvokeMember(methodName, BindingFlags.InvokeMethod, null, control, args);
        };
        if (owner.InvokeRequired)
        {
            owner.Invoke(func);
        }
        else
        {
            func();
        }
        return returnValue;
    }
}    
 
例子(Form):
namespace WindowsFormsApplication1
{
    publicpartialclass MainForm : Form
    {        
        public MainForm()
        {
            InitializeComponent();
        }
 
        privatevoid button1_Click(object sender, EventArgs e)
        {
            Thread thread = new Thread(
                ThreadStart =>
                {                   
                    this.textBox1.SetPropertySafe("Text", "ThreadEdit");
                }
            );
            thread.IsBackground = true;
            thread.Start();
        }
    }
}