c# 代码记录 根据JSON内容 调用对应的Action

using System.Text;
using System.Text.Json;

namespace Test
{
    public enum MessageType
    {
        LoginMessage = 1,
        TransformMessage = 2
    }

    public class BaseMessage
    {
        public MessageType Type { get; set; }
    }

    public class LoginMeesgae: BaseMessage
    {
        public LoginMessageObject Data { get; set; }
    }

    public class LoginMessageObject
    {
        public string Username { get; set; }
        public string Password { get; set; }
    }

    public class TransformMessage: BaseMessage
    {
        public TransfromMessageObject Data {get; set; }
    }

    public class TransfromMessageObject
    {
        public string Pos { get; set; }
        public string Rot { get; set; }
    }

    internal class Program
    {
        static void Main(string[] args)
        {
            VNet vNet = new VNet();
            vNet.RegisterHandel<LoginMeesgae>(MessageType.LoginMessage, (LoginMeesgae data) => {
                Console.WriteLine($"接收到LoginMeesgaes数据{data.Data.Username}");
            });
            vNet.RegisterHandel<TransformMessage>(MessageType.TransformMessage, (TransformMessage data) => {
                Console.WriteLine($"接收到TransformMessage 1 数据{data.Data.Pos}");
            });
            vNet.RegisterHandel<TransformMessage>(MessageType.TransformMessage, (TransformMessage data) => {
                Console.WriteLine($"接收到TransformMessage 2 数据{data.Data.Rot}");
            });
            vNet.Run();
            Console.WriteLine("已经启动");
            Console.ReadKey();
        }
    }

    public class VNet
    {
        private Dictionary<MessageType, Dictionary<int, Delegate>> _handels = new Dictionary<MessageType, Dictionary<int, Delegate>>();
        private Dictionary<MessageType, Type> _messageObjectTypes = new Dictionary<MessageType, Type>();
        private int _incKey = 0;

        public int RegisterHandel<T>(MessageType type, Action<T> action)
        {
            if (!_handels.ContainsKey(type))
            {
                _handels[type] = new Dictionary<int, Delegate>();
            }
            _handels[type][_incKey] = action;
            _messageObjectTypes[type] = typeof(T);
            return _incKey++;
        }

        public async void Run()
        {
            while (true)
            {
                string jsonContent = RecvRawMessage(); 
                BaseMessage? baseMessage = JsonSerializer.Deserialize<BaseMessage>(jsonContent);
                if(baseMessage == null)
                {
                    Console.WriteLine($"反序列化失败2 {jsonContent}");
                    break;
                }
                if (_handels.ContainsKey(baseMessage.Type))
                {
                    Type type = _messageObjectTypes[baseMessage.Type];
                    object? _object = JsonSerializer.Deserialize(jsonContent, type);
                    if(_object == null)
                    {
                        Console.WriteLine($"反序列化失败2 {jsonContent}");
                        break;
                    }
                    foreach(var actionItem in _handels[baseMessage.Type])
                    {
                        actionItem.Value.DynamicInvoke(_object);
                    }
                }
                await Task.Delay(1000);
            }
        }


        public string RecvRawMessage()
        {
            string[] fileNames = { "./jsconfig1.json", "./jsconfig2.json" };
            Random random = new Random();
            return File.ReadAllText(fileNames[random.Next(2)]);
        }

    }
}

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值