C# 反射與 Quartz 實(shí)現(xiàn)流程處理詳情
1、實(shí)現(xiàn)
這里主要用的是反射的方法。用戶要傳入方法名和方法參數(shù),我們就需要先寫函數(shù)返回這些信息,最后再包裝一下返回給用戶。
獲取某一程序集下所有類:(對(duì)我來說,獲取當(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ù)類型,我是通過把method直接tostring(),來解析出輸入類的名稱的,應(yīng)該有其他方法可以拿到輸入類的名稱:
public List<string> GetParameter(MethodInfo methodInfo, Assembly assembly)
{
// 由方法獲取輸入類,創(chuàng)建類
var method_FullName = methodInfo.ToString();
// 方法中找不到input類的信息,只能從fullname中解析出來
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)類來獲取系統(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)系,直接拿依賴注入中的類來反射方法,并執(zhí)行:
// 獲取依賴注入中類
var api = ServiceHelper.Instance.GetService(do_class);
這里的do_class是一個(gè)Type。
最后,是使用invoke來執(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是通過input類獲取的參數(shù)類型而設(shè)置的實(shí)例對(duì)象,由于invoke的參數(shù)類型為objetc[],所以需要再包裝一層。
method是要調(diào)用的方法,api是該類的實(shí)例,從依賴注入中獲取。
總結(jié):
最后就是Quartz的配合,這里就不寫了,可以通過JobDataMap來傳遞參數(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#基于正則表達(dá)式刪除字符串中數(shù)字或非數(shù)字的方法
這篇文章主要介紹了C#基于正則表達(dá)式刪除字符串中數(shù)字或非數(shù)字的方法,涉及C#針對(duì)數(shù)字的簡(jiǎn)單正則匹配相關(guān)操作技巧,需要的朋友可以參考下2017-06-06
C#中使用反射遍歷一個(gè)對(duì)象屬性及值的小技巧
這篇文章主要介紹了C#中使用反射遍歷一個(gè)對(duì)象屬性及值的小技巧,這在很時(shí)候應(yīng)該都非常有用,本文直接給出實(shí)例代碼,需要的朋友可以參考下2015-07-07
解決C# X64應(yīng)用程序中讀取WParam溢出的問題
C#應(yīng)用程序是AnyCPU的,在一段處理鼠標(biāo)滾輪WM_MOUSEWHEEL的代碼里碰到溢出的問題OverflowException2013-04-04
C#實(shí)現(xiàn)將HTML轉(zhuǎn)換成純文本的方法
這篇文章主要介紹了C#實(shí)現(xiàn)將HTML轉(zhuǎn)換成純文本的方法,基于自定義類實(shí)現(xiàn)文本轉(zhuǎn)換功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
C#如何使用Bogus創(chuàng)建模擬數(shù)據(jù)示例代碼
這篇文章主要給大家介紹了關(guān)于C#如何使用Bogus創(chuàng)建模擬數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04

