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