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

时间:2014-07-25 08:45:26

标签: c# events syntax lambda expression

我需要将特定类型的实例(将在此刻创建)传递给方法。这种类型提供了我想订阅的几个事件,所以我的代码看起来像这样:

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...
});

这当然只是因为美容原因而需要。我喜欢我的代码小&可读的。

2 个答案:

答案 0 :(得分:5)

现在这是不可能的,但根据Roslyn,它已经计划好,将来可能会出现。

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

答案 1 :(得分: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();
    }
}
}