2009-06-12 15 views
4

基本上是:在C#中的事件數組?

public delegate void RecvCommandHandler (ChatApplication sender, byte[] content); 
event RecvCommandHandler[] commands = new RecvCommandHandler[255]; 

我想激活每個命令數量不同的方法/函數,但我真的不確定的語法。我該怎麼做?

我想我只會爲這一個代表一組代表,但問題仍然很有趣。

+0

難道你不能使用一個事件(或委託)與eventArgs指定做什麼? – Pondidum 2009-06-12 14:51:23

+0

不除非我想要一個長時間的開關大小寫代碼而沒有檢查null的選項。 – Nefzen 2009-06-12 16:05:06

回答

7

真的沒有事件數組的概念 - 就像談論一組屬性。事件實際上只是允許您訂閱和取消訂閱處理程序的方法。如果你需要能夠通過索引做到這一點,我建議你只有一對方法。 (AddCommandHandler(int, RecvCommandHandler)RemoveCommandHandler(int, RecvCommandHandler))。當然,這不會支持正常的事件處理語法糖,但我沒有看到有很多其他選擇。

+0

只是對介紹的評論 - 我沒有Action []的問題。所以有可能擁有一組方法,問題就在於C#中的事件像某種方法和對象的混合。這應該是正常的類與un//註冊方法和調用。 – greenoldman 2010-08-25 10:38:12

2

另一種選擇是在委託原型指定和指標,並有一個事件處理程序,「委託」給了別人,例如:

public delegate void RecvCommandHandler (int id, ChatApplication sender, byte[] content); 

// ... 

private RecvCommandHandler[] internalhandlers; 

public void MyCommandHandler(int id, ChatApplication sender, byte[] content) 
{ 
    internalHandlers[id](id, sender, content); 
} 
0

我只是在尋找相同的答案,但是我的課也是WPF的事件發件人,所以它看起來應該和普通的C#/ WPF事件發件人類一樣多。所以我只是添加了這個:

發件人:

  • 枚舉具有屬性的名字 - 這是缺乏nameof
  • 一個額外的方法來記錄的跛腳的解決辦法要求

到接收機:

  • 給定枚舉的請求事件

代碼,發件人:

public enum Properties 
    { 
     NetworkFileName, 
     DatasetFileName, 
     LearningWatch 
    } 

    private string network_filename; 
    public string NetworkFileName 
    { 
     get { return network_filename; } 
     private set 
     { 
      if (network_filename != value) 
      { 
       network_filename = value; 
       OnPropertyChanged(Properties.NetworkFileName.ToString()); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged(string name) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
     } 
    } 

    public void OnChange(Properties prop, Action<object, PropertyChangedEventArgs> action) 
    { 
     PropertyChanged += new PropertyChangedEventHandler((obj, args) => { if (args.PropertyName == prop.ToString()) action(obj, args); }); 
    } 

和接收器:

private void OnNetworkLoaded(object sender, PropertyChangedEventArgs e) 
    { 
     SetTitle(); 
    } 

     ... 
     ExpManager.OnChange(ExperimentManager.Properties.DatasetFileName, OnDatasetLoaded); 

它仍然是醜陋,但至少:

  • 我沒有處理與「ifs」在接收器中
  • 我可以輕鬆創建多個事件處理程序
  • 它與WPF兼容
  • 沒有神奇的字符串(我討厭那些)

缺點:

  • obsfuscation廢墟此(不過我對這種情況下的特殊階層,這個項目僅僅是對我來說,所以這裏沒有問題)
7

你可以創建一個類的數組與運算符重載模擬你感興趣的行爲...

public delegate void EventDelegate(EventData kEvent); 

public class EventElement 
{ 
    protected event EventDelegate eventdelegate; 

    public void Dispatch(EventData kEvent) 
    { 
     if (eventdelegate != null) 
     { 
      eventdelegate(kEvent); 
     } 
    } 

    public static EventElement operator +(EventElement kElement, EventDelegate kDelegate) 
    { 
     kElement.eventdelegate += kDelegate; 
     return kElement; 
    } 

    public static EventElement operator -(EventElement kElement, EventDelegate kDelegate) 
    { 
     kElement.eventdelegate -= kDelegate; 
     return kElement; 
    } 
} 

public EventElement[] commands = new EventElement[255]; 

commands[100] += OnWhatever; 
commands[100].Dispatch(new EventData()); 
commands[100] -= OnWhatever;