AddEventHandler使用reflection
我有这段代码不起作用:
public CartaoCidadao() { InitializeComponent(); object o = WebDAV.Classes.SCWatcher.LoadAssembly(); MethodInfo method = this.GetType().GetMethod("Inserted", BindingFlags.NonPublic | BindingFlags.Instance); EventInfo eventInfo = o.GetType().GetEvent("CardInserted"); Type type = eventInfo.EventHandlerType; Delegate handler = Delegate.CreateDelegate(type, this , method); eventInfo.AddEventHandler(o, handler); } void Inserted(string readerName, string cardName) { System.Windows.Forms.MessageBox.Show(readerName); }
Event CardInserted存在于另一个DLL文件中,对象“o”加载OK。 委托处理程序具有效果后的值。 我只能解雇这个事件。
以下是演示如何使用reflection附加事件的示例:
class Program { static void Main(string[] args) { var p = new Program(); var eventInfo = p.GetType().GetEvent("TestEvent"); var methodInfo = p.GetType().GetMethod("TestMethod"); Delegate handler = Delegate.CreateDelegate(eventInfo.EventHandlerType, p, methodInfo); eventInfo.AddEventHandler(p, handler); p.Test(); } public event Func TestEvent; public string TestMethod() { return "Hello World"; } public void Test() { if (TestEvent != null) { Console.WriteLine(TestEvent()); } } }
这是一个简短但完整的例子,它确实有效:
using System; using System.Reflection; class EventPublisher { public event EventHandler TestEvent; public void RaiseEvent() { TestEvent(this, EventArgs.Empty); } } class Test { void HandleEvent(object sender, EventArgs e) { Console.WriteLine("HandleEvent called"); } static void Main() { // Find the handler method Test test = new Test(); EventPublisher publisher = new EventPublisher(); MethodInfo method = typeof(Test).GetMethod ("HandleEvent", BindingFlags.NonPublic | BindingFlags.Instance); // Subscribe to the event EventInfo eventInfo = typeof(EventPublisher).GetEvent("TestEvent"); Type type = eventInfo.EventHandlerType; Delegate handler = Delegate.CreateDelegate(type, test, method); // Raise the event eventInfo.AddEventHandler(publisher, handler); publisher.RaiseEvent(); } }
现在,当你说“我只能点火事件”时,你究竟是什么意思? 你并不打算自己举办活动 – 这取决于活动发布者。 您实际呈现给我们的所有代码是否都有效? 如果是这样,似乎它没有添加事件处理程序,这是问题。
你能提供更多信息吗?
当你说它不起作用时……会发生什么? 没有? 一个例外?
思考:
- 事件和处理程序都是公开的吗? 如果没有,您需要将合适的
BindingFlags
传递给GetEvent
/GetMethod
调用。 - 处理程序的签名是否匹配?
这是一个工作示例(注意我使用的是静态处理程序,因此在Delegate.CreateDelegate
为null):
using System; using System.Reflection; class Test { public event EventHandler SomeEvent; public void OnSomeEvent() { if (SomeEvent != null) SomeEvent(this, EventArgs.Empty); } static void Main() { Test obj = new Test(); EventInfo evt = obj.GetType().GetEvent("SomeEvent"); MethodInfo handler = typeof(Test) .GetMethod("MyHandler"); Delegate del = Delegate.CreateDelegate( evt.EventHandlerType, null, handler); evt.AddEventHandler(obj, del); obj.OnSomeEvent(); } public static void MyHandler(object sender, EventArgs args) { Console.WriteLine("hi"); } }