События C# - есть ли возможность для размышлений отличить простые события от событий с добавлением {...} remove {...}?

Окей, я решил это, когда собирался опубликовать здесь. Я искал способ отличить что-то вроде event Action testEvt1; а также event Action testEvt1 { add { } remove { }} с отражением, так как оба заканчивают как пара методов add_testEvt1 remove_testEvt1. Удивительно, но CompilerGeneratedAttribute здесь не помогает.

Решение оказалось в том, чтобы искать личную резервную копию с тем же именем, что и у события - компилятор сгенерирует только одну для простых событий и не позволит вам иметь другие поля с тем же именем.

Как показывает код:

class Program
    {
        static void Main(string[] args)
        {
            EventInfo evt1 = typeof(a).GetEvent("testEvt1");
            EventInfo evt2 = typeof(a).GetEvent("testEvt2");

            var evt1Attrib = Attribute.GetCustomAttribute(evt1, typeof(CompilerGeneratedAttribute));
            var evt2Attrib = Attribute.GetCustomAttribute(evt2, typeof(CompilerGeneratedAttribute));

            var evt1Backfield = typeof(a).GetField(evt1.Name,BindingFlags.NonPublic | BindingFlags.Instance);
            var evt2Backfield = typeof(a).GetField(evt2.Name, BindingFlags.NonPublic | BindingFlags.Instance);
        }
    }

    public class a
    {
        //private Action testEvt1;
        public event Action testEvt1;
        public event Action testEvt2
        {
            add { }
            remove { }
        }
    }

evt1Attrib и evt2Attrib оба обнуляются. Но поданная поддержка может быть найдена только для простого testEvt1, а не testEvt2.

Я решил опубликовать это, если у кого-то случится такая же проблема и, возможно, спросить, знает ли кто-нибудь более простой способ отличить testEvt1 от testEvt2 и почему компилятор не добавляет CompilerGeneratedAttribute для добавления и удаления методов для событий? Я хотел бы знать о методе, который не основывается на правилах именования полей, которые могут быть изменены в будущем.

1 ответ

Ответ описан выше. Вы должны искать частный экземпляр или статическое (как и рассматриваемое событие) вспомогательное поле с тем же именем.

Другие вопросы по тегам