公安網(wǎng)站備案 時間淘寶推廣費用一般多少
文章速覽
- 概述
- 例程
- 請求類
- 命名空間
- 父類示例
- 子類示例
- 命令類
- 命名空間
- 子類示例
- 記錄的數(shù)據(jù)結構
- 實現(xiàn)綁定方法
堅持記錄實屬不易,希望友善多金的碼友能夠隨手點一個贊。
共同創(chuàng)建氛圍更加良好的開發(fā)者社區(qū)!
謝謝~
概述
需求:
將指定的兩種類型的類進行綁定,記錄到對應的字典中。
思路:
使用反射,獲取指定命名空間下,所有的請求類,判定其是否符合條件,如果符合條件,就尋找對應命名空間中是否存在相應的執(zhí)行類,將其添加入[請求&命令執(zhí)行]字典中,用做后續(xù)命令執(zhí)行的分發(fā)。
例程
首先,需要對兩種類型,各自創(chuàng)建其父類、或是接口;
兩者需要創(chuàng)建在不同的命名空間下,便于反射時的獲取
請求類
命名空間
Test.ReqActions
父類示例
此處的 ActionTypes 作為枚舉,可以定義并標記各中不同的請求
public class ActionBase{public ActionBase(){}public ActionTypes Action { get; set; } public string Msg { get; set; }/// <summary>/// 標記每次執(zhí)行的req 和 ret 對應/// </summary>public long Id { get; set; }}
子類示例
繼承自操作父類,內(nèi)部可以自定義一些個性化屬性
public class ReqCancelProcessing : ActionBase{public ReqCancelProcessing(){Action = ActionTypes.ReqCancelProcessing;AskCancel = true;}public bool AskCancel { get; set; }}
命令類
命名空間
Test.Commands```### 接口示例
定義命令實現(xiàn)的接口,讓繼承的子類,去做具體的邏輯實現(xiàn)
```csharp/// <summary>/// 指令的接口/// </summary>public interface ICommand{/// <summary>/// 處理成功返回1,失敗返回0/// </summary>/// <param name="obj">執(zhí)行指令的對象</param>/// <returns>返回執(zhí)行是否成功</returns>int Execute(object obj);}
子類示例
public class ReqCancelProcessingCommand : ICommand{public int Execute(object obj){ReqCancelProcessing req = obj as ReqCancelProcessing;try{//具體實現(xiàn)邏輯}catch (Exception ex){ }return 1;}}
記錄的數(shù)據(jù)結構
使用字典,這樣便于后期的查找和使用,僅作示例,用string或是上面的枚舉都是ok的
/// <summary>/// 指令動作字典/// </summary>public Dictionary<string, ICommand> ActionToCommand { get; set; } = new Dictionary<string, ICommand>();
實現(xiàn)綁定方法
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)){//創(chuàng)建并添加實例ActionToCommand.Add(actionFullName, (ICommand)Activator.CreateInstance(commandType));}}}}