见下面的样本。我需要将通过反射获得的DoSomething方法连接到事件。
class Program {
private static event EventHandler MyEvent;
static void Main(string[] args)
{
object aType = new SomeType();
var type = aType.GetType();
var method = type.GetMethod("DoSomething");
if (method != null)
{
MyEvent += method;//How do I wire this up?
}
}
}
public class SomeType {
public void DoSomething() {
Debug.WriteLine("DoSomething ran.");
}
}
答案 0 :(得分:4)
您需要创建一个委托:
MyEvent += (EventHandler)Delegate.CreateDelegate(typeof(EventHandler), aType, method);
第二个参数是将委托绑定到的实例 有关详细信息,请参阅my blog。
与任何其他委托一样,这仅在目标方法与委托具有相同签名(参数类型)时才有效。
答案 1 :(得分:4)
实际上,您不能将DoSomething
用作MyEvent
的处理程序,因为它没有正确的签名。假设您将DoSomething
的签名更改为:
public void DoSomething(object sender, EventArgs e)
您可以订阅此类活动:
if (method != null)
{
var dlg = (EventHandler)Delegate.CreateDelegate(typeof(EventHandler), aType, method);
MyEvent += dlg;
}