InvokeHelper 跨线程访问/修改主界面控件

using System; 
using System.Collections.Generic; 
using System.Reflection; 
using System.Text; 
using System.Windows.Forms; 
 
namespace InvokerHelperDemo 

    /// <summary> 
    /// A thread-safe control invoker helper class. 
    /// </summary> 
    public class InvokeHelper 
    { 
        #region delegates 
        private delegate object MethodInvoker(Control control, string methodName, params object[] args); 
 
        private delegate object PropertyGetInvoker(Control control, object noncontrol, string propertyName); 
        private delegate void PropertySetInvoker(Control control, object noncontrol, string propertyName, object value); 
        #endregion 
 
        #region static methods 
        // helpers 
        private static PropertyInfo GetPropertyInfo(Control control, object noncontrol, string propertyName) 
        { 
            if (control != null && !string.IsNullOrEmpty(propertyName)) 
            { 
                PropertyInfo pi = null; 
                Type t = null; 
 
                if (noncontrol != null) 
                    t = noncontrol.GetType(); 
                else 
                    t = control.GetType(); 
 
                pi = t.GetProperty(propertyName); 
 
                if (pi == null) 
                    throw new InvalidOperationException( 
                        string.Format( 
                        "Can't find property {0} in {1}.", 
                        propertyName, 
                        t.ToString() 
                        )); 
 
                return pi; 
            } 
            else 
                throw new ArgumentNullException("Invalid argument."); 
        } 
 
        // outlines 
        public static object Invoke(Control control, string methodName, params object[] args) 
        { 
            if (control != null && !string.IsNullOrEmpty(methodName)) 
                if (control.InvokeRequired) 
                    return control.Invoke( 
                        new MethodInvoker(Invoke), 
                        control, 
                        methodName, 
                        args 
                        ); 
                else 
                { 
                    MethodInfo mi = null; 
 
                    if (args != null && args.Length > 0) 
                    { 
                        Type[] types = new Type[args.Length]; 
                        for (int i = 0; i < args.Length; i++) 
                        { 
                            if (args[i] != null) 
                                types[i] = args[i].GetType(); 
                        } 
 
                        mi = control.GetType().GetMethod(methodName, types); 
                    } 
                    else 
                        mi = control.GetType().GetMethod(methodName); 
 
                    // check method info you get 
                    if (mi != null) 
                        return mi.Invoke(control, args); 
                    else 
                        throw new InvalidOperationException("Invalid method."); 
                } 
            else 
                throw new ArgumentNullException("Invalid argument."); 
        } 
 
        public static object Get(Control control, string propertyName) 
        { 
            return Get(control, null, propertyName); 
        } 
        public static object Get(Control control, object noncontrol, string propertyName) 
        { 
            if (control != null && !string.IsNullOrEmpty(propertyName)) 
                if (control.InvokeRequired) 
                    return control.Invoke(new PropertyGetInvoker(Get), 
                        control, 
                        noncontrol, 
                        propertyName 
                        ); 
                else 
                { 
                    PropertyInfo pi = GetPropertyInfo(control, noncontrol, propertyName); 
                    object invokee = (noncontrol == null) ? control : noncontrol; 
 
                    if (pi != null) 
                        if (pi.CanRead) 
                            return pi.GetValue(invokee, null); 
                        else 
                            throw new FieldAccessException( 
                                string.Format( 
                                "{0}.{1} is a write-only property.", 
                                invokee.GetType().ToString(), 
                                propertyName 
                                )); 
 
                    return null; 
                } 
            else 
                throw new ArgumentNullException("Invalid argument."); 
        } 
 
        public static void Set(Control control, string propertyName, object value) 
        { 
            Set(control, null, propertyName, value); 
        } 
        public static void Set(Control control, object noncontrol, string propertyName, object value) 
        { 
            if (control != null && !string.IsNullOrEmpty(propertyName)) 
                if (control.InvokeRequired) 
                    control.Invoke(new PropertySetInvoker(Set), 
                        control, 
                        noncontrol, 
                        propertyName, 
                        value 
                        ); 
                else 
                { 
                    PropertyInfo pi = GetPropertyInfo(control, noncontrol, propertyName); 
                    object invokee = (noncontrol == null) ? control : noncontrol; 
 
                    if (pi != null) 
                        if (pi.CanWrite) 
                            pi.SetValue(invokee, value, null); 
                        else 
                            throw new FieldAccessException( 
                                string.Format( 
                                "{0}.{1} is a read-only property.", 
                                invokee.GetType().ToString(), 
                                propertyName 
                                )); 
                } 
            else 
                throw new ArgumentNullException("Invalid argument."); 
        } 
        #endregion 
    } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值