0

我正在尝试在 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 ????

提前致谢,周末愉快:-)

托马斯,哥本哈根,丹麦

4

2 回答 2

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>仅使用并删除您的委托类型可能更有意义。

于 2013-10-25T16:27:56.213 回答
-1

您的事件显然不是 EventHandler<TEventArgs> 类型,而是您定义的自定义委托。重新定义事件以使用 EventHandler<TEventArgs> 或使方法的参数为 getArterCompletedEventHandle。

在 C# 中,任何委托只能转换为 Delegate 或 MulticastDelegate 类型,因为它们是任何其他委托的隐式基,就像对象是任何类型的隐式基一样。

于 2013-10-25T16:30:49.227 回答