C#中的事件数组?
基本上:C#中的事件数组?,c#,arrays,events,C#,Arrays,Events,基本上: public delegate void RecvCommandHandler (ChatApplication sender, byte[] content); event RecvCommandHandler[] commands = new RecvCommandHandler[255]; 我想为每个命令编号激活不同的方法/函数,但我确实不确定语法。我该怎么做 我想这一次我将只讨论一组代表,但问题仍然很有趣。实际上没有事件数组的概念,这就像讨论一组属性一样。事件实际上只是允许您
public delegate void RecvCommandHandler (ChatApplication sender, byte[] content);
event RecvCommandHandler[] commands = new RecvCommandHandler[255];
我想为每个命令编号激活不同的方法/函数,但我确实不确定语法。我该怎么做
我想这一次我将只讨论一组代表,但问题仍然很有趣。实际上没有事件数组的概念,这就像讨论一组属性一样。事件实际上只是允许您订阅和取消订阅处理程序的方法。如果您需要能够通过索引来实现这一点,我建议您使用两种方法。(
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事件发送者类一样。所以我简单地加了一句: 发送人:
- 属性名为的枚举--这是缺少nameof的蹩脚解决方法
- 记录请求的另一种方法
private void OnNetworkLoaded(object sender, PropertyChangedEventArgs e)
{
SetTitle();
}
...
ExpManager.OnChange(ExperimentManager.Properties.DatasetFileName, OnDatasetLoaded);
- 给定枚举的请求事件
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); });
}
它仍然丑陋,但至少:
- 我不必在接收机中处理“如果”
- 我可以轻松创建多个事件处理程序
- 它与WPF兼容
- 没有魔术弦(我讨厌那些)
- 混乱破坏了这一点(但我有专门针对这种情况的类,这个项目只适合我,所以这里没有问题)
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一起使用以指定“做什么”吗?除非我想要一个不带检查null选项的长开关大小写代码。只需在介绍中加上一句话——我对操作[]没有问题。因此有可能有一系列方法,问题在于C#中的事件的行为类似于方法和对象的某种混合。它应该是带有un-/register方法和调用的普通类。如果我们有这样的东西,那就太好了。如果我想订阅/取消订阅一个类似于退出钩子的东西,它需要一系列事件(一些取决于执行上下文:IIS、WPF应用程序、控制台程序。可以在任何库中预先不知道它们的情况下注入一个数组/IEnumerable。