C# 反射與 Quartz 實(shí)現(xiàn)流程處理詳情
1、實(shí)現(xiàn)
這里主要用的是反射的方法。用戶要傳入方法名和方法參數(shù),我們就需要先寫函數(shù)返回這些信息,最后再包裝一下返回給用戶。
獲取某一程序集下所有類:(對(duì)我來(lái)說(shuō),獲取當(dāng)前程序集下的類就夠了,要獲取其他程序集或dll的,請(qǐng)查詢其他資料)
public List<string> GetClass(string assembyName = null) { Assembly asm = Assembly.GetExecutingAssembly(); var allclass = asm.ExportedTypes.ToList(); return allclass.Select(u => u.Name).ToList(); }
獲取某一個(gè)類中所有的方法,主要用到GetMethods()
的方法:
public List<string> GetMethod(Type type,string assembyName = null) { // 測(cè)試獲取指定類的方法,去除自帶的GetType方法 List<MethodInfo> methods = type.GetMethods().Where(u=>u.IsVirtual == false) .Where(u => !u.Name.Contains("GetType")).ToList(); return methods.Select(u => u.Name).ToList(); }
獲取某一個(gè)方法的傳入?yún)?shù)類型,我是通過(guò)把method
直接tostring(),
來(lái)解析出輸入類的名稱的,應(yīng)該有其他方法可以拿到輸入類的名稱:
public List<string> GetParameter(MethodInfo methodInfo, Assembly assembly) { // 由方法獲取輸入類,創(chuàng)建類 var method_FullName = methodInfo.ToString(); // 方法中找不到input類的信息,只能從fullname中解析出來(lái) Regex reg = new Regex(@"(?is)(?<=\()(.*)(?=\))"); Match m = reg.Match(method_FullName); string inputName = m.Value.Split(".").Last(); Type input_class = assembly.ExportedTypes.Where(u => u.Name.Contains(inputName)).First(); PropertyInfo[] propertyInfos = input_class.GetProperties(); List<string> result = new List<string>(); foreach ( var item in propertyInfos ) { var returnType = item.GetGetMethod().ReturnType; var name = returnType.ToString(); result.Add(name); } return result; }
可以獲取輸入類的屬性類型。
2、創(chuàng)建實(shí)例,并執(zhí)行方法
如果是用放射的方式實(shí)例化類,很麻煩的是類的構(gòu)造函數(shù)中存在依賴關(guān)系。于是我才用依賴注入中獲取類的方法。
首先,創(chuàng)建一個(gè)IServiceProvider
的靜態(tài)類來(lái)獲取系統(tǒng)依賴注入中的所有服務(wù),再main
函數(shù)中進(jìn)行獲取和賦值:
public static class ServiceHelper { public static IServiceProvider Instance { get; set; } }
在main
中獲取依賴注入:
public static void Main(string[] args) { var webhost = CreateHostBuilder(args).Build(); using ( var scope = webhost.Services.CreateScope() ) { ServiceHelper.Instance = webhost.Services; } webhost.Run(); }
這樣,就可以避免依賴關(guān)系,直接拿依賴注入中的類來(lái)反射方法,并執(zhí)行:
// 獲取依賴注入中類 var api = ServiceHelper.Instance.GetService(do_class);
這里的do_class
是一個(gè)Type
。
最后,是使用invoke
來(lái)執(zhí)行方法:
PropertyInfo[] propertyInfos = input_class.GetProperties(); Object Args = asm.CreateInstance(input_class.FullName); foreach ( var item in propertyInfos ) { var returnType = item.GetGetMethod().ReturnType; var name = returnType.ToString(); // 匹配類型 if ( name.ToLower().Contains("string") ) { item.SetValue(Args, "test"); } else if ( name.ToLower().Contains("int") ) { item.SetValue(Args, 1); } } // 模擬某方法進(jìn)行執(zhí)行 object[] inputArgs = new object[] { Args }; try { var result = method.Invoke(api, inputArgs); } catch ( Exception ex) { Console.WriteLine(ex.Message); }
這里的Args
是通過(guò)input
類獲取的參數(shù)類型而設(shè)置的實(shí)例對(duì)象,由于invoke
的參數(shù)類型為objetc[],
所以需要再包裝一層。
method
是要調(diào)用的方法,api
是該類的實(shí)例,從依賴注入中獲取。
總結(jié):
最后就是Quartz
的配合,這里就不寫了,可以通過(guò)JobDataMap
來(lái)傳遞參數(shù)。再結(jié)合HTTP client
,可以實(shí)現(xiàn)基本流程處理。既可以調(diào)用內(nèi)部函數(shù),也可以http
調(diào)用接口。
到此這篇關(guān)于C# 反射與 Quartz 實(shí)現(xiàn)流程處理詳情的文章就介紹到這了,更多相關(guān)C# 反射與 Quartz 實(shí)現(xiàn)流程處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#數(shù)據(jù)結(jié)構(gòu)與算法揭秘四 雙向鏈表
上節(jié)說(shuō)過(guò)這節(jié)會(huì)講雙向鏈表,環(huán)形鏈表和應(yīng)用舉例,我們開始吧?。。?!2012-11-11C#實(shí)現(xiàn)同Active MQ通訊的方法
這篇文章主要介紹了C#實(shí)現(xiàn)同Active MQ通訊的方法,簡(jiǎn)單分析了Active MQ的功能及C#與之通訊的實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-07-07如何在C#9 中使用頂級(jí)程序 (top-level)
這篇文章主要介紹了如何在C#9 中使用頂級(jí)程序 (top-level),幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-03-03基于XSLT調(diào)試的相關(guān)問(wèn)題
本篇文章是對(duì)XSLT調(diào)試的相關(guān)問(wèn)題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05