MyTetra Share
Делитесь знаниями!
Сохранение методов в словаре, что бы использовать их как команды
Время создания: 18.10.2020 12:34
Раздел: Компьютер - C#
Запись: Kozlov-AE/Tetra/master/base/1603013676ab9chwlg2o/text.html на raw.githubusercontent.com
  1. using Microsoft.VisualBasic;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Text;
  5.  
  6. namespace AnySignatureMethod
  7. {
  8.     class Program
  9.     {
  10.         static void Main(string[] args)
  11.         {
  12.             //Чтобы не писать реализацию сервера, просто заведём переменную с его типом для примера.
  13.             IServer server = null;
  14.             var executor = new Executor();
  15.  
  16.             //Как видно это замыкание, лямбда захватила переменную server
  17.             executor.RegisterMethodHandler("пока", s => server.CloseUserConnection(s.Id));
  18.             executor.RegisterMethodHandler("kill", s =>
  19.             {
  20.                 if (s.Group == ClientsGroup.Admin)
  21.                 {
  22.                     var words = s.GetCommands();
  23.                     //Очевидно что тут какая то логика что вторым словом идёт отключаемый юзер, ладно пускай так)
  24.                     server.CloseUserConnection(words[1]);
  25.                 }
  26.                 else
  27.                 {
  28.                     server.SendMessageToClient("Данная команда вам не доступна, вы не админ", s.Id);
  29.                 }
  30.             });
  31.             executor.RegisterMethodHandler("showclients", s =>
  32.             {
  33.                 if (s.Group == ClientsGroup.Admin)
  34.                 {
  35.  
  36.                     var sb = new StringBuilder();
  37.                     server.GetClientsNamesList().ForEach(n => sb.Append($"{n} \n"));
  38.                     server.SendMessageToClient(sb.ToString(), s.Id);
  39.                 }
  40.                 else
  41.                 {
  42.                     server.SendMessageToClient("Данная команда вам не доступна, вы не админ", s.Id);
  43.                 }
  44.             });
  45.         }
  46.     }
  47.  
  48.     public enum ClientsGroup
  49.     {
  50.         Admin,
  51.         User,
  52.     }
  53.  
  54.     public class Sender
  55.     {
  56.         public string Id { get; set; }
  57.         public ClientsGroup Group { get; set; }
  58.         public string Words { get; set; }
  59.     }
  60.  
  61.     public static class SenderExtentions
  62.     {
  63.         public static string[] GetCommands(this Sender self)
  64.         {
  65.             var commands = self.Words.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
  66.             return commands;
  67.         }
  68.     }
  69.  
  70.     public interface IServer
  71.     {
  72.         void CloseUserConnection(string senderId);
  73.         void SendMessageToClient(string message, string senderId);
  74.         List<string> GetClientsNamesList();
  75.     }
  76.  
  77.     public class Executor
  78.     {
  79.         private readonly Dictionary<string, Action<Sender>> queryMap;
  80.  
  81.         public void RegisterMethodHandler(string queryKey, Action<Sender> method)
  82.         {
  83.             queryMap.Add(queryKey, method);
  84.         }
  85.  
  86.         public void Execute(Sender sender)
  87.         {
  88.             var words = sender.GetCommands();
  89.             foreach (var word in words)
  90.             {
  91.                 queryMap[word].Invoke(sender);
  92.             }
  93.         }
  94.     }
  95. }
Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования