欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > C#-利用反射自动绑定请求标志类和具体执行命令类

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

2024/11/29 22:41:43 来源:https://blog.csdn.net/qq_43733614/article/details/143967623  浏览:    关键词: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命名空间中 并且继承于 ActionBaseif (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类型是否存在, 并且 继承 与 ICommandif (commandType != null && typeof(ICommand).IsAssignableFrom(commandType)){//创建并添加实例ActionToCommand.Add(actionFullName, (ICommand)Activator.CreateInstance(commandType));}}}}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com