From 3c1e0fd9dbdde478c3a55a264954c7c63b47f1f1 Mon Sep 17 00:00:00 2001 From: Ahmed Zamil Date: Tue, 6 Feb 2024 13:45:54 +0300 Subject: [PATCH] Events --- Esiur/Resource/Template/EventTemplate.cs | 30 ++++++++++++++++-------- Esiur/Resource/Template/TypeTemplate.cs | 11 +++++++-- 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/Esiur/Resource/Template/EventTemplate.cs b/Esiur/Resource/Template/EventTemplate.cs index 776e46e..928ae68 100644 --- a/Esiur/Resource/Template/EventTemplate.cs +++ b/Esiur/Resource/Template/EventTemplate.cs @@ -1,4 +1,5 @@ -using Esiur.Data; +using Esiur.Core; +using Esiur.Data; using System; using System.Collections.Generic; using System.Linq; @@ -27,7 +28,7 @@ public class EventTemplate : MemberTemplate var name = base.Compose(); var hdr = Inherited ? (byte)0x80 : (byte)0; - + if (Listenable) hdr |= 0x8; @@ -46,16 +47,16 @@ public class EventTemplate : MemberTemplate } else hdr |= 0x40; - return new BinaryList() - .AddUInt8(hdr) - .AddUInt8((byte)name.Length) - .AddUInt8Array(name) - .AddUInt8Array(ArgumentType.Compose()) - .ToArray(); + return new BinaryList() + .AddUInt8(hdr) + .AddUInt8((byte)name.Length) + .AddUInt8Array(name) + .AddUInt8Array(ArgumentType.Compose()) + .ToArray(); } - public EventTemplate(TypeTemplate template, byte index, string name,bool inherited, RepresentationType argumentType, string annotation = null, bool listenable = false) - : base(template, index, name, inherited) + public EventTemplate(TypeTemplate template, byte index, string name, bool inherited, RepresentationType argumentType, string annotation = null, bool listenable = false) + : base(template, index, name, inherited) { this.Annotation = annotation; this.Listenable = listenable; @@ -64,6 +65,15 @@ public class EventTemplate : MemberTemplate public static EventTemplate MakeEventTemplate(Type type, EventInfo ei, byte index = 0, string customName = null, TypeTemplate typeTemplate = null) { + + if (!ei.EventHandlerType.IsGenericType) + throw new Exception($"Unsupported event handler type in event `{type.Name}.{ei.Name}`"); + + if (ei.EventHandlerType.GetGenericTypeDefinition() != typeof(ResourceEventHandler<>) + && ei.EventHandlerType.GetGenericTypeDefinition() != typeof(CustomResourceEventHandler<>)) + throw new Exception($"Unsupported event handler type in event `{type.Name}.{ei.Name}`"); + + var argType = ei.EventHandlerType.GenericTypeArguments[0]; var evtType = RepresentationType.FromType(argType); diff --git a/Esiur/Resource/Template/TypeTemplate.cs b/Esiur/Resource/Template/TypeTemplate.cs index 2a1c66a..ccb5205 100644 --- a/Esiur/Resource/Template/TypeTemplate.cs +++ b/Esiur/Resource/Template/TypeTemplate.cs @@ -170,7 +170,7 @@ public class TypeTemplate var rt = new Guid(hash); return rt; } - + static Type[] GetDistributedTypes(Type type) { if (type.IsArray) @@ -593,13 +593,20 @@ public class TypeTemplate if (classIsPublic) { - var mis = type.GetMembers(BindingFlags.Public | BindingFlags.Instance + var mis = type.GetMembers(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Static) .Where(x => x.MemberType == MemberTypes.Property || x.MemberType == MemberTypes.Field || x.MemberType == MemberTypes.Event || x.MemberType == MemberTypes.Method) .Where(x => !(x is FieldInfo c && !c.IsStatic)) .Where(x => x.GetCustomAttribute() == null) + .Where(x => x.Name != "Instance") .Where(x => !(x is MethodInfo m && m.IsSpecialName)) + .Where(x=> !(x is EventInfo e && + !(e.EventHandlerType.IsGenericType && + (e.EventHandlerType.GetGenericTypeDefinition() == typeof(ResourceEventHandler<>) + || e.EventHandlerType.GetGenericTypeDefinition() == typeof(CustomResourceEventHandler<>)) + ) + )) .Select(x => new MemberData() { Name = x.GetCustomAttribute()?.Name ?? x.Name,