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)]);
}
}
}
c# 代码记录 根据JSON内容 调用对应的Action
最新推荐文章于 2024-06-14 10:02:06 发布