Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#中的事件数组?_C#_Arrays_Events - Fatal编程技术网

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。