c# 中如何获取事件的委托链

grzx2210 2009-12-16 05:03:55
如题:我现在想获得如Button的Click事件的委托链,即有哪些代理加在事件代理上。我用
((EventHandler)fpSpreadOrder.Change).GetInvocationList();但是不行,
错误为错误:
事件“FarPoint.Win.Spread.FpSpread.Change”只能出现在 += 或 -= 的左边。
不知道有什么办法获得事件的委托链。
注明:不是在自定义控件等事件。而是事件定义外。
...全文
797 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hirisw 2012-03-18
  • 打赏
  • 举报
回复
其他事件怎么去,EventDoubleClick返回就为null
--
谢谢1楼,3楼两位仁兄,解决了, 比如Click事件key为EventClick,但是其他事件key值如何知道,用Reflector。还有就是我一直以为反射也只能解决公有成员的,这里的Events我知道他是保护的,请说下发射的权限限制(public protected等),这个问题解决马上结贴
grzx2210 2009-12-16
  • 打赏
  • 举报
回复
谢谢7楼仁兄讲解,问题解决结贴
我姓区不姓区 2009-12-16
  • 打赏
  • 举报
回复
之前我做的时候是用reflector知道的。
反射只要指定BindingFlags.NonPublic就是获取非公有成员
grzx2210 2009-12-16
  • 打赏
  • 举报
回复
谢谢1楼,3楼两位仁兄,解决了, 比如Click事件key为EventClick,但是其他事件key值如何知道,用Reflector。还有就是我一直以为反射也只能解决公有成员的,这里的Events我知道他是保护的,请说下发射的权限限制(public protected等),这个问题解决马上结贴
wartim 2009-12-16
  • 打赏
  • 举报
回复
恩。。。。。
忘了反射了,失策
wartim 2009-12-16
  • 打赏
  • 举报
回复
不行,事件已经把委托封装了


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication31
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

XEvent += new X(Form1_XEvent);
}

void Form1_XEvent()
{
throw new NotImplementedException();
}

public delegate void X();

X _X;

public event X XEvent
{
add
{
_X += value;
}
remove
{
_X -= value;
}
}

}
}
我姓区不姓区 2009-12-16
  • 打赏
  • 举报
回复

static void Main(string[] args)
{
System.Windows.Forms.Button btn = new System.Windows.Forms.Button();
btn.Click += new EventHandler(btn_Click);
btn.Click += new EventHandler(btn_Click2);
btn.Click += new EventHandler(btn_Click3);
PropertyInfo pi = btn.GetType().GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);
EventHandlerList ehl = (EventHandlerList)pi.GetValue(btn, null);
FieldInfo fieldInfo = (typeof(System.Windows.Forms.Control)).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic);
Delegate d = ehl[fieldInfo.GetValue(null)];
foreach (Delegate del in d.GetInvocationList())
Console.WriteLine(del.Method.Name);
}

static void btn_Click(object sender, EventArgs e)
{
Console.WriteLine("Click1");
}

static void btn_Click2(object sender, EventArgs e)
{
Console.WriteLine("Click2");
}

static void btn_Click3(object sender, EventArgs e)
{
Console.WriteLine("Click3");
}

zetee 2009-12-16
  • 打赏
  • 举报
回复
fpSpreadOrder.Change

是事件,不是委托,事件只能用+ -
zgke 2009-12-16
  • 打赏
  • 举报
回复
这个意思?

private void button1_Click(object sender, EventArgs e)
{
Delegate[] _List = GetObjectEventList(button1, "EventClick", typeof(Control));
}



public static Delegate[] GetObjectEventList(object p_Object, string p_EventName, Type p_EventType)
{
PropertyInfo _PropertyInfo = p_Object.GetType().GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);
if (_PropertyInfo != null)
{
object _EventList = _PropertyInfo.GetValue(p_Object, null);
if (_EventList != null && _EventList is EventHandlerList)
{
EventHandlerList _List = (EventHandlerList)_EventList;
FieldInfo _FieldInfo = p_EventType.GetField(p_EventName, BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.IgnoreCase);
if (_FieldInfo == null) return null;
Delegate _ObjectDelegate = _List[_FieldInfo.GetValue(p_Object)];
if (_ObjectDelegate == null) return null;
return _ObjectDelegate.GetInvocationList();
}
}
return null;
}

110,536

社区成员

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

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

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