gpt4 book ai didi

具有已知事件签名的 C# 2.0 动态事件订阅

转载 作者:行者123 更新时间:2023-11-30 16:35:49 24 4
gpt4 key购买 nike

类似这个问题:

C# Dynamic Event Subscription

我希望能够将事件处理程序连接到从动态创建的对象中触发的事件。我这样做是为了验证我的 JavaScript 和其他非 .NET 代码是否能够连接到对象的事件。

我在对象中的事件签名是:

delegate void MediaItemFellbackDelegate(int id, string name, string path);

这是我的“DynamicHost”代码:

public delegate void MediaItemFellbackDelegate(int id, string name, string path);

public void MediaItemFellback(int id, string name, string path)
{
}


private void HandleEvent(string eventName, Delegate handler)
{
try
{
BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
EventInfo mediaItemFellback = m_PlayerType.GetEvent(eventName, bindingFlags);
mediaItemFellback.AddEventHandler(m_Player, handler);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}

HandleEvent("MediaItemFellback", new MediaItemFellbackDelegate(this.MediaItemFellback));

但我最终得到了异常(exception):

Object of type 'DynamicHost.Main+MediaItemFellbackDelegate' cannot be converted to type 'Player.MediaItemFellbackDelegate'.

在 AddEventHandler() 调用中。

当然,它们是不同的类型,但是签名是相同的。

这里出了什么问题?

最佳答案

很简单,您不能使用错误类型的委托(delegate)来订阅事件。

您可以做的是在HandleEvent 中创建正确 类型的委托(delegate):

private void HandleEvent(string eventName, Delegate handler)
{
try
{
BindingFlags bindingFlags = BindingFlags.Instance |
BindingFlags.Public | BindingFlags.NonPublic;
EventInfo mediaItemFellback = m_PlayerType.GetEvent(eventName, bindingFlags);
Delegate correctHandler = Delegate.CreateDelegate(
mediaItemFellback.EventHandlerType, handler.Target, handler.Method);
mediaItemFellback.AddEventHandler(m_Player, correctHandler);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}

关于具有已知事件签名的 C# 2.0 动态事件订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1492081/

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