无法将类型'System.EventHandler <xxxx>'隐式转换为xxxxCompletedEventHandler </xxxx>

时间:2013-10-25 16:21:00

标签: c# event-handling eventargs

我尝试在C#中进行一些智能事件处理,但我仍然遇到错误消息:

无法隐式转换类型&#39; System.EventHandler&#39;到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,丹麦哥本哈根

2 个答案:

答案 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 是任何类型的隐式基础。