2017-05-31 19 views
0

鑑於我有不同的簽名代表:如何安全射擊事件,無論簽名如何?

public event Action Del1; 
public event Action<int> Del2; 

,我想有一種輔助方法來調用安全委託。電話這樣將是確定的:

FireEvent(Del1); 
FireEvent(Del2(42)); 

下面的方法適用於第一個代表,但當然不是第二:

protected void FireEvent(Action action) 
{ 
    if(action != null) 
    { 
     action(); 
    } 
} 

有一些基類的行動,我可以使用?

謝謝!

+0

通常你安全地調用操作爲:? '行動.Invoke()' 或'行動.Invoke(PARM)' 含義ü需要簽名反正?。 – Cogent

回答

1

如果您使用的是C#6,則可以使用空條件運算符來執行該檢查,而無需使用「安全」方法。

https://msdn.microsoft.com/en-gb/magazine/dn802602.aspx

憑藉空條件運算符,整套實現減少到簡單:

OnTemperatureChanged?.Invoke(this, value)

我創建了一個.NET小提琴在證明這一點動作:

https://dotnetfiddle.net/hukL3u

using System; 

public class Program 
{ 
    public static void Main() 
    { 
     Action actionOne =() => { Console.WriteLine("One"); }; 
     Action<int> actionTwo = (int foo) => { Console.WriteLine("Two " + foo); }; 

     actionOne?.Invoke(); 
     actionTwo?.Invoke(12); 

     actionOne = null; 

     Console.WriteLine("One is null"); 

     actionOne?.Invoke(); 
     actionTwo?.Invoke(12); 

     actionTwo = null; 

     Console.WriteLine("Two is null"); 

     actionOne?.Invoke(); 
     actionTwo?.Invoke(12); 

     Console.WriteLine("Done"); 
    } 
} 

它產生輸出:

一個

兩個12

一個是空

兩個12

二是空

完成

+0

感謝您的努力。是的,這相當不錯,我們仍然使用.NET 4.5,但這似乎是一個很好的未來解決方案。 – Powerslave

+0

C#版本與.net版本分開。您應該能夠在VS 2015和VS 2017中使用C#6功能.https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C%23-6「本文檔介紹了新的C#6的下一個版本的C#語言功能,所有這些功能都可以在VS 2015中實現和使用。「 – AndyJ

+0

如何在.NET Framework 4.5中使用C#6? – Powerslave