gpt4 book ai didi

C# 委托(delegate)和事件?

转载 作者:行者123 更新时间:2023-11-30 21:25:31 25 4
gpt4 key购买 nike

我有一个带有类的程序集,该类使用委托(delegate)和自定义事件参数定义自定义事件。现在我必须通过我的代码动态加载这个程序集并创建这个类的实例。直到这里我都很好。现在我必须使用自定义委托(delegate)为类对象引发的事件提供事件处理程序。如何使用反射向类引发的事件添加事件处理程序?

最佳答案

代码如下:

 class Program
{
static void Main(string[] args)
{
// Create publisher.
var pub = Activator.CreateInstance(typeof(Publisher));
// Get the event.
var addEvent = typeof(Publisher).GetEvent("Event");

// Create subscriber.
var sub = Activator.CreateInstance(typeof(Subscriber));
// Get the method.
var handler = typeof(Subscriber).GetMethod("Handle");
// Create a valid delegate for it.
var handlerDelegate = MakeEventHandlerDelegate(handler, sub);

// Add the event.
addEvent.AddEventHandler(pub, handlerDelegate);

// Call the raise method.
var raise = typeof(Publisher).GetMethod("Raise");
raise.Invoke(pub, new object[] { "Test Value" });
Console.ReadLine();
}

static Delegate MakeEventHandlerDelegate(MethodInfo methodInfo, object target)
{
ParameterInfo[] info = methodInfo.GetParameters();
if (info.Length != 2)
throw new ArgumentOutOfRangeException("methodInfo");
if (!typeof(EventArgs).IsAssignableFrom(info[1].ParameterType))
throw new ArgumentOutOfRangeException("methodInfo");
if (info[0].ParameterType != typeof(object))
throw new ArgumentOutOfRangeException("methodInfo");

return Delegate.CreateDelegate(typeof(EventHandler<>).MakeGenericType(info[1].ParameterType), target, methodInfo);
}
}

class Args : EventArgs
{
public string Value { get; set; }
}

class Publisher
{
public event EventHandler<Args> Event;

public void Raise(string value)
{
if (Event != null)
{
Args a = new Args { Value = value };
Event(this, a);
}
}
}

class Subscriber
{
public void Handle(object sender, Args args)
{
Console.WriteLine("Handle called with {0}.", args.Value);
}
}

关于C# 委托(delegate)和事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/614371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com