【问题标题】:Forwarding Events of Different Type转发不同类型的事件
【发布时间】:2014-06-23 16:46:42
【问题描述】:

我正在尝试将事件从一个类转发到其中包含的对象(如此处所述:Forwarding events in C#)。但是,事件的类型不同。

例如,我有一个 Item 类,它公开了 EventHandler 类型的 ValueChanged 事件处理程序。 ItemHaver 类公开了一个EventHandler<StatusEventArgs>,它应该在Item.ValueChanged 发生时触发,但还应该提供附加信息。如何正确实现add/removeItemValueChanged 事件声明?

在下面的代码中,add 方法中的 lambda 函数是否会执行正确的操作,如果是,那么处理 remove 的正确方法是什么?

class Item
{
    public event EventHandler ValueChanged;
}

class ItemHaver
{
    private int _status;
    private Item _item;

    public event EventHandler<StatusEventArgs> ItemValueChanged
    {
        add 
        { 
            _item.ValueChanged += value; // Wrong type
            _item.ValueChanged += 
                (obj, e) => value(obj, new StatusEventArgs(this._status));
        }
        remove 
        { 
            _item.ValueChanged -= // Does this even work?
                (obj, e) => value(obj, new StatusEventArgs(this._status));  
        }
    }
}

class StatusEventArgs : EventArgs
{
    int Status { get; private set; }
    StatusEventArgs(int status) { Status = status; }
}

【问题讨论】:

    标签: c# events event-handling


    【解决方案1】:

    我会尝试使用字典来映射处理程序。

    class ItemHaver
    {
        private int _status;
        private Item _item;
    
        private Dictionary<EventHandler<StatusEventArgs>, EventHandler> handlersMap = new Dictionary<EventHandler<StatusEventArgs>, EventHandler>();
    
        public event EventHandler<StatusEventArgs> ItemValueChanged
        {
            add
            {
                // _item.ValueChanged += value; // Wrong type
                handlersMap.Add(value, (obj, e) => value(obj, new StatusEventArgs(this._status)));
                _item.ValueChanged += handlersMap[value];
            }
            remove
            {
                _item.ValueChanged -= handlersMap[value];
            }
        }
    }
    

    【讨论】:

    • 谢谢,这似乎有效。我实际上进行了更深入的重构并更改了 Item 类上的底层 EventHandler 以匹配预期的内容(实际代码涉及许多不同类型的 Item,所有这些都是在泛型之前用 C# 开发的。无论如何,我可以不要评论你的方法的效率,但它确实可以作为临时修复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 2020-02-11
    • 2021-12-10
    • 1970-01-01
    • 2018-07-20
    相关资源
    最近更新 更多