自学内容网 自学内容网

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));
                    }
                }
            }
        }

原文地址:https://blog.csdn.net/qq_43733614/article/details/143967623

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!