zoukankan      html  css  js  c++  java
  • 【收集】winform编程多线程开发环境中修改UI的Helper

       1:  /******************************************************************************* 
       2:   * InvokeHelper.cs 
       3:   * A thread-safe control invoker helper class. 
       4:   * ----------------------------------------------------------------------------- 
       5:   * Project:Conmajia.Controls 
       6:   * Author:Conmajia 
       7:   * Url:conmajia@gmail.com 
       8:   * History: 
       9:   *      4th Aug., 2012 
      10:   *      Added support for "Non-control" controls (such as ToolStripItem). 
      11:   *       
      12:   *      4th Aug., 2012 
      13:   *      Initiated. 
      14:   ******************************************************************************/  
      15:  using System;  
      16:  using System.Collections.Generic;  
      17:  using System.Reflection;  
      18:  using System.Text;  
      19:  using System.Windows.Forms;  
      20:    
      21:  namespace InvokerHelperDemo  
      22:  {  
      23:      /// <summary>  
      24:      /// A thread-safe control invoker helper class.  
      25:      /// </summary>  
      26:      public class InvokeHelper  
      27:      {  
      28:          #region delegates  
      29:          private delegate object MethodInvoker(Control control, string methodName, params object[] args);  
      30:    
      31:          private delegate object PropertyGetInvoker(Control control, object noncontrol, string propertyName);  
      32:          private delegate void PropertySetInvoker(Control control, object noncontrol, string propertyName, object value);  
      33:          #endregion  
      34:   
      35:          #region static methods  
      36:          // helpers  
      37:          private static PropertyInfo GetPropertyInfo(Control control, object noncontrol, string propertyName)  
      38:          {  
      39:              if (control != null && !string.IsNullOrEmpty(propertyName))  
      40:              {  
      41:                  PropertyInfo pi = null;  
      42:                  Type t = null;  
      43:    
      44:                  if (noncontrol != null)  
      45:                      t = noncontrol.GetType();  
      46:                  else  
      47:                      t = control.GetType();  
      48:    
      49:                  pi = t.GetProperty(propertyName);  
      50:    
      51:                  if (pi == null)  
      52:                      throw new InvalidOperationException(  
      53:                          string.Format(  
      54:                          "Can't find property {0} in {1}.",  
      55:                          propertyName,  
      56:                          t.ToString()  
      57:                          ));  
      58:    
      59:                  return pi;  
      60:              }  
      61:              else  
      62:                  throw new ArgumentNullException("Invalid argument.");  
      63:          }  
      64:    
      65:          // outlines  
      66:          public static object Invoke(Control control, string methodName, params object[] args)  
      67:          {  
      68:              if (control != null && !string.IsNullOrEmpty(methodName))  
      69:                  if (control.InvokeRequired)  
      70:                      return control.Invoke(  
      71:                          new MethodInvoker(Invoke),  
      72:                          control,  
      73:                          methodName,  
      74:                          args  
      75:                          );  
      76:                  else  
      77:                  {  
      78:                      MethodInfo mi = null;  
      79:    
      80:                      if (args != null && args.Length > 0)  
      81:                      {  
      82:                          Type[] types = new Type[args.Length];  
      83:                          for (int i = 0; i < args.Length; i++)  
      84:                          {  
      85:                              if (args[i] != null)  
      86:                                  types[i] = args[i].GetType();  
      87:                          }  
      88:    
      89:                          mi = control.GetType().GetMethod(methodName, types);  
      90:                      }  
      91:                      else  
      92:                          mi = control.GetType().GetMethod(methodName);  
      93:    
      94:                      // check method info you get  
      95:                      if (mi != null)  
      96:                          return mi.Invoke(control, args);  
      97:                      else  
      98:                          throw new InvalidOperationException("Invalid method.");  
      99:                  }  
     100:              else  
     101:                  throw new ArgumentNullException("Invalid argument.");  
     102:          }  
     103:    
     104:          public static object Get(Control control, string propertyName)  
     105:          {  
     106:              return Get(control, null, propertyName);  
     107:          }  
     108:          public static object Get(Control control, object noncontrol, string propertyName)  
     109:          {  
     110:              if (control != null && !string.IsNullOrEmpty(propertyName))  
     111:                  if (control.InvokeRequired)  
     112:                      return control.Invoke(new PropertyGetInvoker(Get),  
     113:                          control,  
     114:                          noncontrol,  
     115:                          propertyName  
     116:                          );  
     117:                  else  
     118:                  {  
     119:                      PropertyInfo pi = GetPropertyInfo(control, noncontrol, propertyName);  
     120:                      object invokee = (noncontrol == null) ? control : noncontrol;  
     121:    
     122:                      if (pi != null)  
     123:                          if (pi.CanRead)  
     124:                              return pi.GetValue(invokee, null);  
     125:                          else  
     126:                              throw new FieldAccessException(  
     127:                                  string.Format(  
     128:                                  "{0}.{1} is a write-only property.",  
     129:                                  invokee.GetType().ToString(),  
     130:                                  propertyName  
     131:                                  ));  
     132:    
     133:                      return null;  
     134:                  }  
     135:              else  
     136:                  throw new ArgumentNullException("Invalid argument.");  
     137:          }  
     138:    
     139:          public static void Set(Control control, string propertyName, object value)  
     140:          {  
     141:              Set(control, null, propertyName, value);  
     142:          }  
     143:          public static void Set(Control control, object noncontrol, string propertyName, object value)  
     144:          {  
     145:              if (control != null && !string.IsNullOrEmpty(propertyName))  
     146:                  if (control.InvokeRequired)  
     147:                      control.Invoke(new PropertySetInvoker(Set),  
     148:                          control,  
     149:                          noncontrol,  
     150:                          propertyName,  
     151:                          value  
     152:                          );  
     153:                  else  
     154:                  {  
     155:                      PropertyInfo pi = GetPropertyInfo(control, noncontrol, propertyName);  
     156:                      object invokee = (noncontrol == null) ? control : noncontrol;  
     157:    
     158:                      if (pi != null)  
     159:                          if (pi.CanWrite)  
     160:                              pi.SetValue(invokee, value, null);  
     161:                          else  
     162:                              throw new FieldAccessException(  
     163:                                  string.Format(  
     164:                                  "{0}.{1} is a read-only property.",  
     165:                                  invokee.GetType().ToString(),  
     166:                                  propertyName  
     167:                                  ));  
     168:                  }  
     169:              else  
     170:                  throw new ArgumentNullException("Invalid argument.");  
     171:          }  
     172:          #endregion  
     173:      }  
     174:  }

    原创文字只代表本人某一时间内的观点或结论,本人不对涉及到的任何代码担保。转载请标明出处!

  • 相关阅读:
    第六十篇、音视频采集硬编码(H264+ACC)
    第十三篇、Swift_Nav自定义返回按钮后或者隐藏导航栏,Pop返回手势失效的解决方法 Pop全局返回添加的方法
    第五十九篇、OC录制小视频
    第五十八篇、iOS 微信聊天发送小视频的秘密
    第五十七篇、AVAssetReader和AVAssetWrite 对视频进行编码
    第五十六篇、OC打开本地和网络上的word、ppt、excel、text等文件
    Objective-C 编码建议
    在block中使用self
    纯代码TableView自适应高度(很老的使用方法)
    iOS应用架构谈 网络层设计方案
  • 原文地址:https://www.cnblogs.com/leleroyn/p/2665821.html
Copyright © 2011-2022 走看看