【问题标题】:C# External Array of FunctionsC# 外部函数数组
【发布时间】:2011-02-22 04:04:39
【问题描述】:

好的,这又是关于我的项目了。我有客户端和服务器。它们相互通信,数据包具有以下结构 [OP CODE] [LENGTH] [DATA]

现在在服务器端,我想从外部 .cs 文件中为每个 OPcode 加载功能代码。

所以编译后会是这个样子

- OPCODES
-- OPCODE1.cs
-- OPCODE2.cs
-- OPCODE3.cs
-- OPCODE4.cs
OPCODES.cfg (has list of all op codes and location for function code)
MyProgram.exe

我该如何做这样的事情?

【问题讨论】:

    标签: c# arrays function external


    【解决方案1】:

    你可以创建一个字典(假设操作码是一个整数

            Dictionary<int, Action> actions = new Dictionary<int, Action>();
            actions[7] = () => Console.WriteLine("hello World");
    

    执行操作码“7”你可以这样做

            actions[7]();
    

    如果你想让它更健壮:

            Action action;
            if (actions.TryGetValue(7, out action))
                action();
            // else illegal opcode
    

    如果你想从文件中加载动作字典,那就有点复杂了 你可以通过这样的字典调用静态方法ConsoleApplicationTest.Program.MyMethod()

    namespace ConsoleApplicationTest
    {
    public class Program
    {
        public static void MyMethod()
        {
            Console.WriteLine("MyMethod called");
        }
     } 
     }
    

    字典可以是这样的

            Dictionary<int, MethodInfo> dynamicActions = new Dictionary<int, MethodInfo>();
    
            dynamicActions[7] = Assembly.GetExecutingAssembly().GetType("ConsoleApplicationTest.Program").GetMethod("MyMethod", BindingFlags.Public | BindingFlags.Static);
    

    方法会这样调用

            MethodInfo method;
            if (dynamicActions.TryGetValue(7, out method))
                method.Invoke(null, new object[0]);
    

    【讨论】:

      【解决方案2】:

      您可以使用 case switch 来表示收到了一些数据包。

      switch(packet.OpCode)
      {
         case 1:
         OnHelloPacket();
         break;
         case 2:
         OnInfoPaket();
         break;
         //etc
      }
      

      【讨论】:

        【解决方案3】:

        看起来您正在寻找比简单的枚举或动作字典更具动态性的东西。您在问题中提到“OPCODES.cfg(具有所有操作码的列表和功能码的位置)”。这是否意味着操作码函数不一定要与主服务器应用程序一起编译?

        如果是这种情况,您可能会考虑某种插件架构,因此您可以随时添加和删除操作码函数。我推荐MEF 作为一个很好的起点。

        【讨论】:

          猜你喜欢
          • 2020-04-18
          • 2018-05-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-23
          • 2018-09-24
          • 2011-05-16
          相关资源
          最近更新 更多