c# 反射 带自定义参数的事件(100分求教)

iland9876543210 2010-03-22 04:57:07
自己做了一个DLL,里面定义了一个具有自定义参数的事件,该怎样反射该事件?

同一个事件,如果使用系统参数System.EventArgs,反射没有任何问题。


自定义事件参数如下:(主要是想通过事件参数获得额外信息)

public class MyEventArgs:EventArgs
{
public MyEventArgs(string s)
{
message=s;
}
private string message="";
private object obj=null;
public object MyObject
{
get{return obj;}
set{obj=value;}
}
}

在创建代理实例是发生错误,请各位高手给些建议。谢了!
...全文
416 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
iland9876543210 2010-03-24
  • 打赏
  • 举报
回复
问题出在这句:Delegate d = Delegate.CreateDelegate(tDelegate, miHandler);

使用自定义参数主要是为了传递更多信息,是按照MSDN上的例子做的。当然,如果使用sender传递同时使用标准的事件参数没有任何问题,主要是想知道问题在哪里?

错误提示:
System.ArgumentException: Error binding to target method.

谢谢!
iland9876543210 2010-03-24
  • 打赏
  • 举报
回复
我的机器上网不方便,码字很麻烦的。



方法和下面类似,


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" });
}
}
}
}
}

iland9876543210 2010-03-24
  • 打赏
  • 举报
回复
谢谢各位,问题找到了。

主要是本地委托事件的参数必须使用object,然后反射e的自定义属性,类型不能直接使用自定义事件参数类。

结贴!!!!
healer_kx 2010-03-22
  • 打赏
  • 举报
回复
你应该使用EventArgs,而不是自己派生一个,你无法知道系统在这个参数上会做什么事情。
以上是题外话。

至于反射不成功,你可以看看EventArgs的构造函数是什么形式的?
人家可是没有带有一个string的构造函数啊。
此外Namespace也可能是出问题的原因。
liangchencf 2010-03-22
  • 打赏
  • 举报
回复
异常是什么?给个大致的代码吧
liangchencf 2010-03-22
  • 打赏
  • 举报
回复
异常的错误是什么?

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧