csharp: InvokeHelper
Entity Framework
https://entityframework.codeplex.com/
Enterprise Library
<?xml version="1.0"?>
<configuration> <startup>
<supportedRuntime version="v2.0.50727"/></startup>
</configuration>
App.config
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection; namespace InvokerHelperDemo
{
/// <summary>
/// http://www.getcodesamples.com/src/E6947A0/4F02A4B8
///
/// </summary>
public class Helpers
{
static private System.Collections.Generic.SortedDictionary<object, DuInvokeHelper> m_List = new SortedDictionary<object, DuInvokeHelper>();
/// <summary>
///
/// </summary>
/// <param name="Instance"></param>
/// <param name="helper"></param>
public static void AddHelper(object Instance, DuInvokeHelper helper)
{
m_List.Add(Instance, helper);
}
/// <summary>
///
/// </summary>
/// <param name="Instance"></param>
/// <returns></returns>
public static DuInvokeHelper find(object Instance)
{
if (m_List.ContainsKey(Instance))
return m_List[Instance];
else
return null;
} }
/// <summary>
///
/// </summary>
public class DuInvokeHelper
{
static System.Collections.Generic.Dictionary<string, Type> Types = new Dictionary<string, Type>();
protected object m_Instance;
Type m_Type;
/// <summary>
///
/// </summary>
public object Instance
{
get
{
return m_Instance;
}
}
/// <summary>
///
/// </summary>
/// <param name="Instance"></param>
public DuInvokeHelper(object Instance)
{
m_Instance = Instance;
m_Type = Instance.GetType();
// Helpers.AddHelper(Instance, this);
}
/// <summary>
///
/// </summary>
/// <param name="Instance"></param>
/// <param name="type"></param>
public DuInvokeHelper(object Instance, Type type)
{
m_Instance = Instance;
m_Type = type;
}
/// <summary>
///
/// </summary>
/// <param name="FieldName"></param>
/// <returns></returns>
public bool HasField(string FieldName)
{
foreach (FieldInfo field in m_Type.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance))
{
if (field.Name == FieldName)
return true;
}
return false;
}
/// <summary>
///
/// </summary>
/// <param name="FieldName"></param>
/// <returns></returns>
public object GetProperty(string FieldName)
{
return m_Type.InvokeMember(FieldName,
BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty,
null, this.m_Instance, null); }
/// <summary>
///
/// </summary>
/// <param name="FieldName"></param>
/// <param name="Value"></param>
/// <returns></returns>
public object SetProperty(string FieldName, object Value)
{
return m_Type.InvokeMember(FieldName,
BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty,
null, this.m_Instance, new object[] { Value });
}
/// <summary>
///
/// </summary>
/// <param name="FieldName"></param>
/// <param name="args"></param>
/// <returns></returns>
public object GetField(string FieldName, object[] args)
{
return m_Type.InvokeMember(FieldName,
BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetField,
null, this.m_Instance, args);
}
/// <summary>
///
/// </summary>
/// <param name="FieldName"></param>
/// <param name="args"></param>
/// <returns></returns>
public object SetField(string FieldName, object[] args)
{
return m_Type.InvokeMember(FieldName, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetField, null, this.m_Instance, args);
}
/// <summary>
///
/// </summary>
/// <param name="FieldName"></param>
/// <param name="Value"></param>
/// <returns></returns>
public object SetField(string FieldName, object Value)
{
return SetField(FieldName, new object[] { Value });
}
/// <summary>
///
/// </summary>
/// <param name="PropertyName"></param>
/// <returns></returns>
public object StaticGetProperty(string PropertyName)
{
return m_Type.InvokeMember(PropertyName,
BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.GetProperty,
null, null, null);
}
/// <summary>
///
/// </summary>
/// <param name="args"></param>
/// <returns></returns>
public object CreateInstance(object[] args)
{
return null;
} /// <summary>
///
/// </summary>
/// <param name="FieldName"></param>
/// <returns></returns>
public object GetField(string FieldName)
{
return GetField(FieldName, null);
}
/// <summary>
///
/// </summary>
/// <param name="MethodName"></param>
/// <param name="args"></param>
/// <param name="modifiers"></param>
/// <returns></returns>
public object InvokeByRef(string MethodName, ref object[] args, ParameterModifier modifiers)
{
ParameterModifier[] mod = { modifiers }; return m_Type.InvokeMember(MethodName,
BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod,
null, m_Instance, args, mod, null, null);
}
/// <summary>
///
/// </summary>
/// <param name="MethodName"></param>
/// <param name="args"></param>
/// <param name="modifiers"></param>
/// <returns></returns>
public object InvokeByOut(string MethodName, object[] args, ParameterModifier modifiers)
{
ParameterModifier[] mod = { modifiers }; return m_Type.InvokeMember(MethodName,
BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod,
null, m_Instance, args, mod, null, null);
}
/// <summary>
///
/// </summary>
/// <param name="MethodName"></param>
/// <param name="args"></param>
/// <returns></returns>
public object Invoke(string MethodName, object[] args)
{
return m_Type.InvokeMember(MethodName, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod, null, m_Instance, args);
}
/// <summary>
///
/// </summary>
/// <param name="MethodName"></param>
/// <param name="args"></param>
/// <returns></returns>
public object InvokeStatic(string MethodName, object[] args)
{
return m_Type.InvokeMember(MethodName, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.InvokeMethod, null, null, args);
}
/// <summary>
///
/// </summary>
/// <param name="MethodName"></param>
/// <param name="arg1"></param>
/// <param name="arg2"></param>
/// <returns></returns>
public object InvokeStatic(string MethodName, object arg1, object arg2)
{
return InvokeStatic(MethodName, new object[] { arg1, arg2 });
}
/// <summary>
///
/// </summary>
/// <param name="MethodName"></param>
/// <param name="arg1"></param>
/// <returns></returns>
public object InvokeStatic(string MethodName, object arg1)
{
return InvokeStatic(MethodName, new object[] { arg1 });
}
/// <summary>
///
/// </summary>
/// <param name="MethodName"></param>
/// <returns></returns>
public object InvokeStatic(string MethodName)
{
return InvokeStatic(MethodName, null);
} /// <summary>
///
/// </summary>
/// <param name="MethodName"></param>
/// <returns></returns>
public object Invoke(string MethodName)
{
return Invoke(MethodName, null);
}
/// <summary>
///
/// </summary>
/// <param name="MethodName"></param>
/// <param name="arg1"></param>
/// <returns></returns>
public object Invoke(string MethodName, object arg1)
{
return Invoke(MethodName, new object[] { arg1 });
}
/// <summary>
///
/// </summary>
/// <param name="MethodName"></param>
/// <param name="arg1"></param>
/// <returns></returns>
public object Invoke(string MethodName, int arg1)
{
return Invoke(MethodName, new object[] { arg1 });
}
/// <summary>
///
/// </summary>
/// <param name="MethodName"></param>
/// <param name="obj1"></param>
/// <param name="obj2"></param>
/// <returns></returns>
public object Invoke(string MethodName, object obj1, object obj2)
{
return Invoke(MethodName, new object[] { obj1, obj2 });
}
/// <summary>
///
/// </summary>
/// <param name="MethodName"></param>
/// <param name="obj1"></param>
/// <param name="obj2"></param>
/// <param name="obj3"></param>
/// <returns></returns>
public object Invoke(string MethodName, object obj1, object obj2, object obj3)
{
return Invoke(MethodName, new object[] { obj1, obj2, obj3 });
}
/// <summary>
///
/// </summary>
/// <param name="TypeName"></param>
/// <returns></returns>
public static Type FindType(string TypeName)
{
if (Types.ContainsKey(TypeName))
return Types[TypeName];
Type ret = null;
foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
{
foreach (Module module in assembly.GetModules())
{
foreach (Type type in module.GetTypes())
{
if (type.FullName == TypeName)
{
ret = type;
Types.Add(TypeName, ret);
return ret;
}
}
} }
Types.Add(TypeName, ret); return ret; } } }
/*******************************************************************************
* 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.
/// 善用IAsyncResult
/// 利用BeginInvoke与EndInvoke完成异步委托方法
/// 线程Thread有一个属性IsBackground,通过把此属性设置为true,就可以把线程设置为后台线程
/// </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
/// <summary>
/// helpers
/// </summary>
/// <param name="control"></param>
/// <param name="noncontrol"></param>
/// <param name="propertyName"></param>
/// <returns></returns>
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.");
} /// <summary>
/// outlines
/// </summary>
/// <param name="control"></param>
/// <param name="methodName"></param>
/// <param name="args"></param>
/// <returns></returns>
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.");
}
/// <summary>
///
/// </summary>
/// <param name="control"></param>
/// <param name="propertyName"></param>
/// <returns></returns>
public static object Get(Control control, string propertyName)
{
return Get(control, null, propertyName);
}
/// <summary>
///
/// </summary>
/// <param name="control"></param>
/// <param name="noncontrol"></param>
/// <param name="propertyName"></param>
/// <returns></returns>
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.");
}
/// <summary>
///
/// </summary>
/// <param name="control"></param>
/// <param name="propertyName"></param>
/// <param name="value"></param>
public static void Set(Control control, string propertyName, object value)
{
Set(control, null, propertyName, value);
}
/// <summary>
///
/// </summary>
/// <param name="control"></param>
/// <param name="noncontrol"></param>
/// <param name="propertyName"></param>
/// <param name="value"></param>
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
}
}
用例:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Threading;
using System.Windows.Forms; namespace InvokerHelperDemo
{
/// <summary>
///
/// </summary>
public partial class Form1 : Form
{ /// <summary>
///
/// </summary>
/// <returns></returns>
DataTable setData()
{
DataTable dt = new DataTable();
dt.Columns.Add("id", typeof(int));
dt.Columns.Add("name", typeof(string));
dt.Columns.Add("date", typeof(DateTime));
dt.Rows.Add(1,"ds","2015-01-02");
dt.Rows.Add(2, "sb", "2015-01-02");
dt.Rows.Add(3, "sg", "2015-01-02");
return dt; } /// <summary>
///
/// </summary>
public Form1()
{
InitializeComponent();
} Thread t;
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
if (t == null)
{
t = new Thread(multithread);
t.Start();
label4.Text = string.Format(
"Thread state:\n{0}",
t.ThreadState.ToString()
);
}
}
/// <summary>
///
/// </summary>
/// <param name="msg"></param>
public void DoWork(string msg)
{
this.label3.Text = string.Format("Invoke method: {0}", msg);
}
//
int count = 0;
/// <summary>
///
/// </summary>
void multithread()
{
//while (true)
//{ InvokeHelper.Set(this.label1, "Text", string.Format("Set value: {0}", count));
InvokeHelper.Set(this.label1, "Tag", count);
InvokeHelper.Set(this.dataGridView1, "DataSource", setData());
string value = InvokeHelper.Get(this.label1, "Tag").ToString();
InvokeHelper.Set(this.label2, "Text",
string.Format("Get value: {0}", value)); InvokeHelper.Invoke(this, "DoWork", value); Thread.Sleep(500);
count++;
//} }
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
if (t != null && t.IsAlive)
t.Abort();
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load(object sender, EventArgs e)
{ }
}
}
http://www.codeproject.com/Articles/29680/Towards-Cleaner-Code-A-C-Asynchronous-Helper
http://www.codeproject.com/Articles/29829/Towards-Cleaner-Code-II-a-C-GUI-Invoke-Async-Helpe
http://www.codeproject.com/Articles/10346/Remoting-with-GUIs
csharp: InvokeHelper的更多相关文章
- c#操作MangoDB 之MangoDB CSharp Driver驱动详解
序言 MangoDB CSharp Driver是c#操作mongodb的官方驱动. 官方Api文档:http://api.mongodb.org/csharp/2.2/html/R_Project_ ...
- c#进阶之神奇的CSharp
CSharp 简写为c#,是一门非常年轻而又有活力的语言. CSharp的诞生 在2000年6月微软发布了c#这门新的语言.作为微软公司.NET 平台的主角,c#吸收了在他之前诞生的语言(c ...
- WindowsCE project missing Microsoft.CompactFramework.CSharp.targets in Visual Studio 2008
00x0 前言 之前在Windows 7系统中开发的WindowsCE项目,最近换成Windows 10系统,需要将项目进行修改,打开项目后提示如下错误: 无法读取项目文件"App.cspr ...
- csharp: Oracle Stored Procedure DAL using ODP.NET
paging : http://www.codeproject.com/Articles/44858/Custom-Paging-GridView-in-ASP-NET-Oracle https:// ...
- Excel转Json,Json转CSharp
一份给策划最好的礼物!就是:Excel2Json2CSharp 策划配置Excel,动不动就要改数值啊,增加字段啊. 程序这边对应的解析类就得改动啊.整一个麻烦了得! 所以我就整理了这个Excel2J ...
- Microsoft.CompactFramework.CSharp.targets not found
今天打开VS2008的智能设备项目,报以下错误,应该是文件找不到了. The imported project "C:\WINDOWS\Microsoft.NET\Framework\v3. ...
- CSharp 相关知识点小结
1.JS获取iframe下面的内容document.getElementById('IFRAME1').contentDocument; 2.dialog 弹出层,定位:postion:'bottom ...
- 自己动手制作CSharp编译器
在你喜欢的位置(如F盘根目录)新建一个文件夹,并命名为“CSharp开发环境”.找到或下载C#编译器组件(csc.exe和cscui.exe),并放在先前建立的文件夹中.该组件的一般位置在C盘的.NE ...
- Storm系列(二):使用Csharp创建你的第一个Storm拓扑(wordcount)
WordCount在大数据领域就像学习一门语言时的hello world,得益于Storm的开源以及Storm.Net.Adapter,现在我们也可以像Java或Python一样,使用Csharp创建 ...
随机推荐
- linux 笔试题
一.填空题: 1. 在Linux系统中,以 文件 方式访问设备 . 2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统. 3. Linux文件系统中每个文件用 i节点 来 ...
- UML2
UML中有3种构造块:事物.关系和图,事物是对模型中最具有代表性的成分的抽象:关系是把事物结合在一起:图聚集了相关的的事物.具体关系图标如下 说明:构件事物是名词,是模型的静态部分.行为事物是动态部分 ...
- JavaScript - 2个等号与3个等号的区别
简言之,== equality 等同,=== identity 恒等. ==, 两边值类型不同的时候,要先进行类型转换,再比较. ===,不做类型转换,类型不同的一定不等. 或: = 赋值运算符 == ...
- 科谱,如何单机环境下合理的备份mssql2008数据库
前言: 终于盼来了公司的自用服务器:1U.至强CPU 1.8G 4核.16G内存.500G硬盘 X 2 (RAID1);装了64位win2008,和64位mssql2008.仔细把玩了一天把新老业务系 ...
- Python 中的进程、线程、协程、同步、异步、回调
进程和线程究竟是什么东西?传统网络服务模型是如何工作的?协程和线程的关系和区别有哪些?IO过程在什么时间发生? 一.上下文切换技术 简述 在进一步之前,让我们先回顾一下各种上下文切换技术. 不过首先说 ...
- iTunes Connect突然登录不了的原因
突然使用开发者账号登录不了iTunes Connect了,提示:Your Apple ID or password was entered incorrectly. 这是由于iTunes Connec ...
- Ruby on Rails 和 J2EE:两者能否共存?
http://www.ibm.com/developerworks/cn/java/wa-rubyonrails/
- java框架篇---spring IOC依赖注入
spring依赖注入的方式有4种 构造方法注入 属性注入 工厂注入 注解注入 下面通过一个实例统一讲解: User.java package com.bjsxt.model; public class ...
- 2014 网选 5014 Number Sequence(异或)
/* 题意:a, b两个序列,规定由[0, n]区间的数! 求 a[i] ^ b[i] 的和最大! 思路:如果数字 n的二进制有x位, 那么一定存在一个数字m,使得n^m的所有二进制位 都是1,也就是 ...
- Java Annotation认知(包括框架图、详细介绍、示例说明)
摘要 Java Annotation是JDK5.0引入的一种注释机制. 网上很多关于Java Annotation的文章,看得人眼花缭乱.Java Annotation本来很简单的,结果说的人没说清楚 ...