using System.Reflection; namespace Pilz.Networking.Api; public class ApiServer : ApiClient, IApiServer { protected readonly Dictionary handlers = []; protected readonly Dictionary serializers = []; public IMessageSerializer Serializer { get; set; } = new DefaultMessageSerializer(); public virtual void RegisterHandler(string url, T instance) where T : class { var methods = typeof(T).GetMethods(BindingFlags.Instance | BindingFlags.Public); foreach (var method in methods) { if (method.GetCustomAttribute() is not MessageHandlerAttribute attribute || method.GetParameters().FirstOrDefault() is not ParameterInfo parameterInfo || !parameterInfo.ParameterType.IsAssignableTo(typeof(ApiMessage))) continue; var serializer = Serializer; if (attribute.Serializer is not null) { if (serializers.TryGetValue(attribute.Serializer, out var s) && s is not null) serializer = s; else if (Activator.CreateInstance(attribute.Serializer) is IMessageSerializer ss) { serializer = ss; serializers.Add(attribute.Serializer, ss); } } // ... } } public virtual void RegisterHandler(string url, Delegate handler) { // ... } protected virtual string? HandleMessage(string url, string json) { // ... } }