Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.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#_Winforms_Events - Fatal编程技术网

C# 如何将一个事件分配给另一个事件?

C# 如何将一个事件分配给另一个事件?,c#,winforms,events,C#,Winforms,Events,我需要将属性和事件数据复制到另一个实例。但无法复制事件 是否可以将事件分配给实例的另一个事件 我有下面的结构 类EventAssign包含一些名为“Changed”的属性和事件,可以修改EventAssign的此已更改事件及其属性并订阅事件 出于我的目的,我正在复制创建的EventAssign实例及其属性和事件,如下所示 public EventAssign CreateDuplicate(EventAssign event) { EventAssign eventAssign = ne

我需要将属性和事件数据复制到另一个实例。但无法复制事件

是否可以将事件分配给实例的另一个事件

我有下面的结构

类EventAssign包含一些名为“Changed”的属性和事件,可以修改EventAssign的此已更改事件及其属性并订阅事件

出于我的目的,我正在复制创建的EventAssign实例及其属性和事件,如下所示

public EventAssign CreateDuplicate(EventAssign event)
{
    EventAssign eventAssign = new EventAssign();
    eventAssign properties = event properties
    // and here i want to copy the events**
    return eventAssign;
}

任何人请告诉我,如何实现这个场景。

很有可能你不应该这样做,但如果你真的想这样做,你可以使用反射。Regular event(无自定义添加\删除)是一个围绕字段的包装器,其中包含在引发事件时调用的委托。您需要复制该字段。示例代码:

public class Program {
    public static void Main() {
        var target = new EventAssign
        {
            Prop = "test"
        };
        target.Changed += (sender, args) =>
        {
            Console.WriteLine("Invoked!");
        };
        var copy = Copy(target);
        target.InvokeChanged();
        // handler was copied too, so invoking event on copy
        // will also run handler above
        copy.InvokeChanged();
    }

    static EventAssign Copy(EventAssign target) {
        var copy = new EventAssign();
        copy.Prop = target.Prop;
        // get all events via reflection
        var publicEvents = typeof(EventAssign).GetEvents(BindingFlags.Instance | BindingFlags.Public);
        foreach (var ev in publicEvents) {
            // each "regular" event (without custom add\remove) should have
            // a backing field with the same name
            var evField = typeof(EventAssign).GetField(ev.Name, BindingFlags.Instance | BindingFlags.NonPublic);
            if (evField == null || evField.FieldType != ev.EventHandlerType)
                continue;
            // copy this field value
            evField.SetValue(copy, evField.GetValue(target));
        }
        return copy;
    }
}

class EventAssign {
    public string Prop { get; set; }
    public event EventHandler Changed;

    public void InvokeChanged() {
        Changed?.Invoke(this, EventArgs.Empty);
    }
}

不,您不能复制常规事件的句柄,这是出于设计和安全原因。为什么不提供一些关于为什么要这样做的细节呢?不管你在做什么,肯定有更好的方法。可能相关:.@ManfredRadlwimmer-我需要复制事件,因为我将这些事件用于我的子控件,而子控件也需要订阅这些事件。您不使用同一实例有什么特殊原因吗?我看不出复制其他实例的现有事件对您有任何帮助。“您不应该这样做的可能性很高”,非常高的可能性。