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