我需要将属性和事件数据复制到另一个实例。但这些事件无法复制。
有什么办法可以将事件分配给实例的另一个事件吗?
我有以下结构,
类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;
}
任何人请告诉我,如何实现这种情况。
答案 0 :(得分:2)
很有可能你不应该这样做,但如果你真的想要 - 你可以使用反射。常规事件(没有自定义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);
}
}