簡體   English   中英

如何將一個事件分配給另一個事件?

[英]How to assign a event to another event?

我需要將屬性和事件數據復制到另一個實例。 但是事件無法復制。

有什么辦法可以將事件分配給實例的另一個事件?

我有以下結構,

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;
}

請讓我知道如何實現此方案。

您極有可能不應該這樣做,但是如果您確實想要-可以使用反射。 常規事件(無自定義add \\ remove)是包含委托的字段的包裝,當引發事件時會調用該委托。 您需要復制該字段。 樣例代碼:

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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM