Handling Messages

Started by
9 comments, last by deadcode 10 years, 10 months ago

C# reflection based example


using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;

namespace Server
{
    //game message
    class Message
    {
        public byte[] Data { get; set; }

        public byte Opcode { get; set; }
    }


    interface IMessageHandler
    {
        void DoMessage(Message message);
    }

    internal class OpcodeAttribute : Attribute
    {
        //or enum
        public byte Opcode { get; set; }

        public OpcodeAttribute(byte opcode)
        {
            Opcode = opcode;
        }
    }

    [Opcode(5)]
    class WalkMessageHandler : IMessageHandler
    {
        public void DoMessage(Message message)
        {
            byte[] bytes = message.Data;
            //todo parse message 
        }
    }


    class MessageHandlerBucket
    {
        private readonly Dictionary<byte,IMessageHandler> _handlers = new Dictionary<byte, IMessageHandler>();

        /// <summary>
        /// 
        /// </summary>
        /// <param name="handlersAssembly">all hanlders in one assembly in this case</param>
        public MessageHandlerBucket(Assembly handlersAssembly)
        {
            IEnumerable<Type> types = handlersAssembly.GetTypes().Where(x => x.IsSubclassOf(typeof (IMessageHandler)));
            foreach (var type in types)
            {
                object opcode = type.GetCustomAttributes(typeof (OpcodeAttribute), true).FirstOrDefault();
                if (opcode == null)
                    continue;
                var opcodeAttribute = (OpcodeAttribute) opcode;
                byte code = opcodeAttribute.Opcode;
                var handler = (IMessageHandler) Activator.CreateInstance(type);
                _handlers.Add(code, handler);
            }
        }


        public void Handle(Message message)
        {
            byte opcode = message.Opcode;
            IMessageHandler handler = _handlers[opcode];
            if(handler== null) return;//or throw
            handler.DoMessage(message);
        }
    }
}

This topic is closed to new replies.

Advertisement