在对象初始化期间添加事件处理程序

问题描述 投票:0回答:3

我需要将某种类型的实例(此时将创建)传递给方法。这种类型提供了几个我也想订阅的事件,所以我的代码如下所示:

var instance = new Instance();
instance.OnEvent1 += (sender, args) => {
    DoThis();
    DoThat();
}
instance.OnEvent2 += (sender, args) => DoThisToo();
instance.OnEvent3...
MyMethod(instance);

现在,是否可以在初始化期间添加处理程序?所以我可以写这样的东西:

MyMethod((MyType)instance => {
    instance.OnEvent1 += (sender, args) => {
        DoThis();
        DoThat();
    }
    instance.OnEvent2...
});

这当然只是出于美观的原因。我喜欢我的代码小且可读。

c# events syntax lambda expression
3个回答
5
投票

目前还不可能,但根据

Roslyn
,这是计划中的,并且可能在将来可用。

--------------------------------------------------------------------------
| Feature            | Example                                |   C#     |
-------------------------------------------------------------------------|
| Event initializers |  new Customer { Notify += MyHandler }; | Planned  |
-------------------------------------------------------------------------|

0
投票

如果源代码可用,我可以建议您使用下一个技巧:添加具有事件类型的公共属性,该事件在集合上获取传入值并将此处理程序附加到您需要的事件

例如:

namespace TrickAddEventHandlerInObjectInitializer
{
class A
{
    public EventHandler AddHandlerToEventByAssignMe
    {
        set { Event += value; }
    }

    public event EventHandler Event;

    public void DoSmthAndInvoke()
    {
        Event?.Invoke(this, new EventArgs());
    }
}

class Program
{
    static void Main(string[] args)
    {
        var a = new A
        {
            AddHandlerToEventByAssignMe = A_Event
        };

        a.DoSmthAndInvoke();
    }

    private static void A_Event(object sender, EventArgs e)
    {
        throw new NotImplementedException();
    }
}
}

0
投票

有时在初始化表达式中设置事件处理程序是有意义的,而且很有帮助。乔恩·斯基特的评论表明这就是所问的问题。由于 C#6 中所期望的功能没有实现,替代方案是

            var instance =
                ((Func<Instance>)(() =>
                {
                    var p = new Instance();
                    p.OnEvent1 += (sender, args) => { DoThis(); DoThat(); };
                    return p;
                }))();

在为属性设置默认支持字段时非常有用,否则很难订阅事件。

© www.soinside.com 2019 - 2024. All rights reserved.