反射事件参数
2014-09-16 15:29
267 查看
namespace ConsoleApplication
{
class Program
{
public static void s_TestEvent(string msg)
{
Console.WriteLine(msg);
}
static void Main(string[] args)
{
Assembly ass = Assembly.Load("ConsoleApplication");
object structInstance = ass.CreateInstance("ConsoleApplication.PrivateField");
Type structType = structInstance.GetType();
EventInfo eventInfo = structType.GetEvent("TestEvent", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static);
Type tDelegate = eventInfo.EventHandlerType;
MethodInfo miHandler = typeof(Program).GetMethod("s_TestEvent", BindingFlags.Public | BindingFlags.Static);
Delegate d = Delegate.CreateDelegate(tDelegate, miHandler);
MethodInfo miAddHandler = eventInfo.GetAddMethod();
object[] addHandlerArgs = { d };
miAddHandler.Invoke(structInstance, addHandlerArgs);
FieldInfo _Field = structType.GetField("TestEvent", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static);
if (_Field != null)
{
object _FieldValue = _Field.GetValue(structInstance);
if (_FieldValue != null && _FieldValue is Delegate)
{
Delegate _ObjectDelegate = _FieldValue as Delegate;
_ObjectDelegate.DynamicInvoke(new object[] {"Sandy" });
}
}
}
}
}
{
class Program
{
public static void s_TestEvent(string msg)
{
Console.WriteLine(msg);
}
static void Main(string[] args)
{
Assembly ass = Assembly.Load("ConsoleApplication");
object structInstance = ass.CreateInstance("ConsoleApplication.PrivateField");
Type structType = structInstance.GetType();
EventInfo eventInfo = structType.GetEvent("TestEvent", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static);
Type tDelegate = eventInfo.EventHandlerType;
MethodInfo miHandler = typeof(Program).GetMethod("s_TestEvent", BindingFlags.Public | BindingFlags.Static);
Delegate d = Delegate.CreateDelegate(tDelegate, miHandler);
MethodInfo miAddHandler = eventInfo.GetAddMethod();
object[] addHandlerArgs = { d };
miAddHandler.Invoke(structInstance, addHandlerArgs);
FieldInfo _Field = structType.GetField("TestEvent", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static);
if (_Field != null)
{
object _FieldValue = _Field.GetValue(structInstance);
if (_FieldValue != null && _FieldValue is Delegate)
{
Delegate _ObjectDelegate = _FieldValue as Delegate;
_ObjectDelegate.DynamicInvoke(new object[] {"Sandy" });
}
}
}
}
}
相关文章推荐
- 利用反射解决QueryString和Session中的参数绑定问题
- .Net反射技术应用解决对象不同版本方法不同参数的问题
- 利用java的反射机制得到界面类的所有可以增加的事件列表
- java的反射机制(含数组参数)
- 事件处理程序中sender参数的用法
- 一个通过反射改变request的请求参数的方法
- 获取checkbox onclick事件中的参数
- 使用反射前后的参数化工厂方法
- 使用反射清除所有挂在事件上的delegate
- 原来的事件的参数
- COM的连接点的Fire事件如何传出SAFEARRAY * * Message参数
- HOW TO:以事件名称与方法名称为参数的事件关联
- 反射中使用值类型与引用类型的参数的区别
- 控制台的下的反射出Button控件的属性,方法,事件
- [ASP.NET]按键跳转以及按Enter以不同参数提交,及其他感应事件
- [ASP.NET]按键跳转以及按Enter以不同参数提交,及其他感应事件
- 用createEventObject来模拟事件参数
- 巧用Button的Command事件,用CommandArgument来传递参数
- C#学习之静态成员和非静态成员,构造函数,方法,方法参数,操作符重载,事件
- 使用强大的反射取消事件的订阅。