InvokeHelper类

简介: 1 /******************************************************************************* 2 * InvokeHelper.
  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 Sunnov.BlogAnalytics
 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 }

 

----------------------------------------------------
专注Web和.NET开发,对前沿技术有深厚的兴趣~~~
个人独立博客图享网--【 http://2sharings.com】,欢迎到访。
目录
相关文章
|
1月前
|
Java
JAVARandom类
JAVARandom类
14 0
|
1月前
|
Java
JAVAFile类
JAVAFile类
10 0
|
1月前
|
Java
JAVASystem类
JAVASystem类
7 0
|
1月前
|
Java 索引
JAVAStringBuilder类
JAVAStringBuilder类
9 0
|
1月前
|
C# 数据安全/隐私保护
56.c#:filelnfo类
56.c#:filelnfo类
13 2
|
1月前
|
API C# vr&ar
59.c#:steamWriter类
59.c#:steamWriter类
16 0
|
2月前
|
存储 编译器 C++
c++类全面讲解
前言 这次主要讲类的基础、构造函数与析构函数的使用,以及继承和多态。
75 0
|
6月前
|
分布式数据库
|
9月前
|
JavaScript 前端开发
在JavaScript中,类(`Class`)是一种创建对象的模板,它可以用来定义对象的属性和方法。类是一种抽象的概念,它定义了对象的行为和状态,而对象则是类的一个具体实例。
|
编译器 数据安全/隐私保护
【C++Primer】第7章:类
【C++Primer】第7章:类