2014-07-25 56 views
2

我需要将某个类型的实例(将在此时刻创建)传递给方法。这种类型提供了几个事件,我想订阅过它,所以我的代码如下所示:在对象初始化期间添加事件处理程序

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

这当然只是因为美观的原因所期望的。我喜欢我的代码小&可读。

+4

这看起来不像是“初始化期间” - 看起来像是“作为方法调用的一部分”。你实际上是否意味着你想这样做:var instance = new Instance {OnEvent1 + = ...}'?如果是这样,答案是你可以在C#6中做到这一点...... –

+0

@JonSkeet好消息!不能将lambda表达式参数视为初始化(匿名类型)? – xvdiff

+0

不是真的......它只是提供方法的一种方式。这本身不是初始化。 –

回答

5

这是不可能的,但根据Roslyn它是计划和将来可用。

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

真的很期待它。谢谢! – xvdiff

+0

请注意,这回答了我怀疑OP真正想要的东西,但不*匹配问题中指定的内容 - 这是在lambda表达式中添加事件处理程序。这已经得到支持。我怀疑OP在对象初始值设定项和lambda表达式之间有点混乱。 –

+0

如果你很想看到这个功能,你可以在GitHub上投票:https://github.com/dotnet/csharplang/issues/307 –

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

你的建议是什么?请添加更多解释,说明您如何解决OP的问题 – techspider

+0

techspider,好的。 –

相关问题