我正在尝试在 C# 中进行一些智能事件处理,但我被一条错误消息卡住了:
无法将类型"System.EventHandler"隐式转换为 xxxxCompleteEventHandler
我有一段代码看起来像这样:
_ServiceAgentArt.Test((s,e) => _List = e.ListOfDTOArt, new DTOArt { Gruppe_id = 1700 });
在 ServiceAgentArt 类中的测试方法中,我有以下代码:
public delegate void getArterCompletedEventHandler(getArterCompletedEventArgs e);
public class getArterCompletedEventArgs : EventArgs
{
public List<DTOArt> ListOfDTOArt { get; set; }
}
sealed class ServiceAgentArt : ServiceAgentBase
{
public event getArterCompletedEventHandler EventGetArterCompleted;
public void Test(EventHandler<getArterCompletedEventArgs> e, DTOArt _DTOArt)
{
EventGetArterCompleted += e;
this.GetFromWEBAPI(string.Format("/apiart/getarter?id={0}", _DTOArt.Gruppe_id));
}
protected override void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
if (EventGetArterCompleted != null)
EventGetArterCompleted(new getArterCompletedEventArgs { ListOfDTOArt = e.Result.DecodeJSONFromStream<List<DTOArt>>() });
}
}
但是.Net不喜欢代码行EventGetArterCompleted += e;,我完全理解它试图告诉我的,eventargs不能强制转换为事件处理程序。
我肯定在这里缺少一些东西,有没有办法将事件处理程序 e 添加到委托 EventGetArterDone ????
提前感谢,周末快乐:-)
托马斯, 哥本哈根, 丹麦
比较两个签名时:
public delegate void EventHandler<TEventArgs>(Object sender, TEventArgs e);
public delegate void getArterCompletedEventHandler(getArterCompletedEventArgs e);
你可以看到唯一真正的区别(与你的TEventArgs
)是一个有sender
,另一个没有。 假设您确实想使用这两种单独的委托类型,您可以通过传入 null
sender
来执行此操作以使其工作。
EventGetArterCompleted += ea => e(null, ea);
或者,如果您的ServiceAgentArt
实例应该是发送方:
EventGetArterCompleted += ea => e(this, ea);
仅使用 EventHandler<getArterCompletedEventArgs>
并删除委托类型可能更有意义。
您的事件显然不是 EventHandler
在 C# 中,任何委托只能强制转换为委托或多播委托类型,因为它们是任何其他委托的隐式基,就像对象是任何类型的隐式基一样。