• 跨线程访问控件类


    使用方法: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
    }
    }

  • 相关阅读:
    搜索各种按钮图标的网页
    查找数据库中所有有自增列的用户表
    清明时节的随想
    基础数据的来源的统一
    使用VS2012开发的网站或者webservice在IIS6.0上发布的注意事项
    [六、页面跳转]21快速打开一个警告窗口
    [六、页面跳转]17使用@SceneStorage存储各个场景的状态
    [六、页面跳转]15使用@Environment访问环境中的指定key的值
    [六、页面跳转]22快速打开一个动作表单
    [六、页面跳转]20通过popover方法快速打开模态窗口
  • 原文地址:https://www.cnblogs.com/zhuawang/p/3104808.html
Copyright © 2020-2023  润新知