基本上是:在C#中的事件數組?
public delegate void RecvCommandHandler (ChatApplication sender, byte[] content);
event RecvCommandHandler[] commands = new RecvCommandHandler[255];
我想激活每個命令數量不同的方法/函數,但我真的不確定的語法。我該怎麼做?
我想我只會爲這一個代表一組代表,但問題仍然很有趣。
基本上是:在C#中的事件數組?
public delegate void RecvCommandHandler (ChatApplication sender, byte[] content);
event RecvCommandHandler[] commands = new RecvCommandHandler[255];
我想激活每個命令數量不同的方法/函數,但我真的不確定的語法。我該怎麼做?
我想我只會爲這一個代表一組代表,但問題仍然很有趣。
真的沒有事件數組的概念 - 就像談論一組屬性。事件實際上只是允許您訂閱和取消訂閱處理程序的方法。如果你需要能夠通過索引做到這一點,我建議你只有一對方法。 (AddCommandHandler(int, RecvCommandHandler)
和RemoveCommandHandler(int, RecvCommandHandler)
)。當然,這不會支持正常的事件處理語法糖,但我沒有看到有很多其他選擇。
只是對介紹的評論 - 我沒有Action []的問題。所以有可能擁有一組方法,問題就在於C#中的事件像某種方法和對象的混合。這應該是正常的類與un//註冊方法和調用。 – greenoldman 2010-08-25 10:38:12
另一種選擇是在委託原型指定和指標,並有一個事件處理程序,「委託」給了別人,例如:
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);
}
我只是在尋找相同的答案,但是我的課也是WPF的事件發件人,所以它看起來應該和普通的C#/ WPF事件發件人類一樣多。所以我只是添加了這個:
發件人:
到接收機:
代碼,發件人:
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);
它仍然是醜陋,但至少:
缺點:
你可以創建一個類的數組與運算符重載模擬你感興趣的行爲...
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;
難道你不能使用一個事件(或委託)與eventArgs指定做什麼? – Pondidum 2009-06-12 14:51:23
不除非我想要一個長時間的開關大小寫代碼而沒有檢查null的選項。 – Nefzen 2009-06-12 16:05:06