[英]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.