Если вы опускаете фигурные скобки в функции стрелки, вы создаете неявный возврат , который эквивалентен созданию явного возврата с фигурными скобками, например: () => { return throw 42 };
Однако , вы можете вернуть только выражений , но не выражений . И throw
это утверждение.
На самом деле нет понятия массива событий - это все равно что говорить о массиве свойств. На самом деле события - это просто методы, которые позволяют вам подписываться и отказываться от подписки. Если вам нужно иметь возможность делать это по индексу, я предлагаю вам просто иметь пару методов. ( AddCommandHandler (int, RecvCommandHandler)
и RemoveCommandHandler (int, RecvCommandHandler)
). Это, конечно, не будет поддерживать синтаксический сахар нормальной обработки событий, но я не вижу много альтернативы.
Другой вариант - указать и индексировать в прототипе делегата и иметь один обработчик событий, который «делегирует» другим, например:
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);
Это все еще некрасиво, но по крайней мере:
Недостаток: