2014-07-25 102 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,好的。 –

相關問題