我尝试在C#中进行一些智能事件处理,但我仍然遇到错误消息:
无法隐式转换类型' System.EventHandler'到xxxxCompletedEventHandler
我有一段看起来像这样的代码:
_ServiceAgentArt.Test((s,e) => _List = e.ListOfDTOArt, new DTOArt { Gruppe_id = 1700 });
在ServiceAgentArt类的方法Test中,我有以下代码:
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不能被转换为事件处理程序。
我肯定在这里遗漏了一些东西,有没有办法将eventhandler e添加到委托EventGetArterCompleted ????
提前致谢并度过愉快的周末: - )
Thomas,丹麦哥本哈根
答案 0 :(得分:2)
比较两个签名时:
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>
并删除您的委托类型可能更有意义。
答案 1 :(得分:-1)
您的活动显然不属于EventHandler&lt; TEventArgs&gt;类型,但您已定义的自定义委托。重新定义事件以使用EventHandler&lt; TEventArgs&gt;或者使方法的参数为getArterCompletedEventHandle。
在C#中,任何委托只能转换为Delegate或MulticastDelegate类型,因为它们是任何其他委托的隐式基础,例如 object 是任何类型的隐式基础。