当前位置: 首页 > article >正文

C#-利用反射自动绑定请求标志类和具体执行命令类

文章速览

  • 概述
  • 例程
    • 请求类
      • 命名空间
      • 父类示例
      • 子类示例
    • 命令类
      • 命名空间
      • 子类示例
    • 记录的数据结构
    • 实现绑定方法

坚持记录实属不易,希望友善多金的码友能够随手点一个赞。
共同创建氛围更加良好的开发者社区!
谢谢~

概述

需求:
将指定的两种类型的类进行绑定,记录到对应的字典中。

思路:
使用反射,获取指定命名空间下,所有的请求类,判定其是否符合条件,如果符合条件,就寻找对应命名空间中是否存在相应的执行类,将其添加入[请求&命令执行]字典中,用做后续命令执行的分发。

例程

首先,需要对两种类型,各自创建其父类、或是接口;
两者需要创建在不同的命名空间下,便于反射时的获取

请求类

命名空间

Test.ReqActions

父类示例

此处的 ActionTypes 作为枚举,可以定义并标记各中不同的请求

    public class ActionBase
    {
        public ActionBase()
        {
            
        }

        public ActionTypes Action { get; set; } 

        public string Msg { get; set; }

        /// <summary>
        /// 标记每次执行的req 和 ret 对应
        /// </summary>
        public long Id { get; set; }
    }

子类示例

继承自操作父类,内部可以自定义一些个性化属性

    public class ReqCancelProcessing : ActionBase
    {
        public ReqCancelProcessing()
        {
            Action = ActionTypes.ReqCancelProcessing;

            AskCancel = true;
        }

        public bool AskCancel { get; set; }
    }

命令类

命名空间

Test.Commands```

###  接口示例
定义命令实现的接口,让继承的子类,去做具体的逻辑实现
```csharp
    /// <summary>
    /// 指令的接口
    /// </summary>
    public interface ICommand
    {
        /// <summary>
        /// 处理成功返回1,失败返回0
        /// </summary>
        /// <param name="obj">执行指令的对象</param>
        /// <returns>返回执行是否成功</returns>
        int Execute(object obj);
    }

子类示例


    public class ReqCancelProcessingCommand : ICommand
    {
        public int Execute(object obj)
        {
            ReqCancelProcessing req = obj as ReqCancelProcessing;
            try
            {
                //具体实现逻辑
            }
            catch (Exception ex)
            {          
            }

            return 1;
        }
    }

记录的数据结构

使用字典,这样便于后期的查找和使用,仅作示例,用string或是上面的枚举都是ok的

        /// <summary>
        /// 指令动作字典
        /// </summary>
        public Dictionary<string, ICommand> ActionToCommand { get; set; } = new Dictionary<string, ICommand>();

实现绑定方法


        const string actionsNamespace = "Test.ReqActions";

        const string commandsNamespace = "Test.Commands";

        /// <summary>
        /// 将指令和Action相互绑定,并加入字典中
        /// </summary>
        private void AddActionsToDictionary()
        {
            //获取当前程序集
            Assembly assembly = Assembly.GetExecutingAssembly();
            
            foreach (Type type in assembly.GetTypes())
            {
                //检查类型是否在ReqActions命名空间中 并且继承于 ActionBase
                if (type.Namespace == actionsNamespace &&
                    typeof(ActionBase).IsAssignableFrom(type))
                {
                    //获取类的全名
                    string actionFullName = type.FullName;

                    //获取对应的Command类型
                    Type commandType = assembly.GetTypes().FirstOrDefault(t =>
                    t.Namespace == commandsNamespace && t.Name == type.Name + "Command");

                    //检查对应的Command类型是否存在, 并且 继承 与 ICommand
                    if (commandType != null && typeof(ICommand).IsAssignableFrom(commandType))
                    {
                        //创建并添加实例
                        ActionToCommand.Add(actionFullName, (ICommand)Activator.CreateInstance(commandType));
                    }
                }
            }
        }

http://www.kler.cn/a/405383.html

相关文章:

  • 006-自定义枚举注解
  • spring-logback引用外部文件
  • 【CSP CCF记录】201903-1第16次认证 小中大
  • Nuxt.js 应用中的 webpack:configResolved事件钩子
  • Bug:引入Feign后触发了2次、4次ContextRefreshedEvent
  • 【架构】主流企业架构Zachman、ToGAF、FEA、DoDAF介绍
  • Parker派克防爆电机在实际应用中的安全性能如何保证?
  • k8s常见问题及解决办法
  • 【python基础巩固】引用、浅深拷贝你分清了吗?
  • 【单元测试】【Android】JUnit 4 和 JUnit 5 的差异记录
  • 私有化部署视频平台EasyCVR宇视设备视频平台如何构建视频联网平台及升级视频转码业务?
  • 前端:HTML (学习笔记)【2】
  • 提升性能测试效率与准确性:深入解析JMeter中的各类定时器
  • jdk各个版本介绍
  • java学习-集合
  • 数据新时代:如何选择现代数据治理平台(上)
  • 数据结构及算法--排序篇
  • 如何能让安全责任更清晰——构建清晰安全责任体系策略与实践
  • 数字IC后端实现时钟树综合系列教程 | Clock Tree,Clock Skew Group之间的区别和联系
  • 【工程记录】vscode+ssh远程配置python环境方法
  • 嵌入式:STM32的启动(Startup)文件解析
  • 生成式AI在教育技术中的应用:变革与创新
  • 开源生态发展合作倡议
  • 蓝桥杯-顺子日期
  • wireshark使用lua解析自定义协议
  • 神经网络问题之:梯度不稳定