【问题标题】:Cannot implicitly convert type 'System.EventHandler<xxxx>' to xxxxCompletedEventHandler无法将类型“System.EventHandler<xxxx>”隐式转换为 xxxxCompletedEventHandler
【发布时间】:2013-10-25 16:20:59
【问题描述】:

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

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

托马斯,丹麦哥本哈根

【问题讨论】:

    标签: c# event-handling eventargs


    【解决方案1】:

    比较两个签名时:

    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&lt;getArterCompletedEventArgs&gt; 并删除您的委托类型可能更有意义。

    【讨论】:

      【解决方案2】:

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

      在 C# 中,任何委托只能转换为 Delegate 或 MulticastDelegate 类型,因为它们是任何其他委托的隐式基,例如 object 是任何类型的隐式基。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-11
        • 1970-01-01
        • 2020-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-18
        相关资源
        最近更新 更多