zoukankan      html  css  js  c++  java
  • 跨线程访问控件类

    使用方法:InvokeHelper.Set(this.label1, "Visible", false);

    /*******************************************************************************
    * InvokeHelper.cs
    * A thread-safe control invoker helper class.
    * -----------------------------------------------------------------------------
    * Project:Conmajia.Controls
    * Author:Conmajia
    * Url:conmajia@gmail.com
    * History:
    * 4th Aug., 2012
    * Added support for "Non-control" controls (such as ToolStripItem).
    *
    * 4th Aug., 2012
    * Initiated.
    ******************************************************************************/
    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
    }
    }

  • 相关阅读:
    关于devDependencies和dependencies报错提示及区别 --save 和--save-dev 的区别
    git 创建分支并提交到远程
    静态类中,静态方法和静态变量的执行顺序按出现执行
    Java和C#语法对比
    大数据时遇到的问题
    Javascript技巧笔记
    Javascript特性笔记
    Javascript 之《函数传参到底是值传递还是引用传递》
    Javascript之《创建对象》
    IE之诡异行为
  • 原文地址:https://www.cnblogs.com/zhuawang/p/3104808.html
Copyright © 2011-2022 走看看