События 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 ответ
Ответ описан выше. Вы должны искать частный экземпляр или статическое (как и рассматриваемое событие) вспомогательное поле с тем же именем.