最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# 反射與 Quartz 實(shí)現(xiàn)流程處理詳情

 更新時間:2021年09月16日 09:48:43   作者:陳子白  
根據(jù)要實(shí)現(xiàn)流程處理,比如用戶可以定義一個定時任務(wù),每周一查看報表。任務(wù)是用Quartz可實(shí)現(xiàn),但用戶自己選擇報表就比較麻煩,這時因?yàn)橄到y(tǒng)的不同模塊的生成報表的函數(shù)不同,這時便可以傳入一個方法名和方法的輸入?yún)?shù),就可以調(diào)用該方法。下面小編我為大家介紹具體過程

1、實(shí)現(xiàn)

這里主要用的是反射的方法。用戶要傳入方法名和方法參數(shù),我們就需要先寫函數(shù)返回這些信息,最后再包裝一下返回給用戶。

獲取某一程序集下所有類:(對我來說,獲取當(dāng)前程序集下的類就夠了,要獲取其他程序集或dll的,請查詢其他資料)

public List<string> GetClass(string assembyName = null)
{
     Assembly asm = Assembly.GetExecutingAssembly();
     var allclass = asm.ExportedTypes.ToList();
     return allclass.Select(u => u.Name).ToList();
}


獲取某一個類中所有的方法,主要用到GetMethods()的方法:

public List<string> GetMethod(Type type,string assembyName = null)
        {
              // 測試獲取指定類的方法,去除自帶的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();
        }


獲取某一個方法的傳入?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)建一個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是一個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í)例對象,由于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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

丹东市| 甘泉县| 永宁县| 宜城市| 离岛区| 北碚区| 黄龙县| 临夏市| 婺源县| 江陵县| 泌阳县| 平度市| 鄢陵县| 湘潭县| 嘉鱼县| 大邑县| 灌南县| 泌阳县| 石城县| 堆龙德庆县| 秭归县| 正蓝旗| 外汇| 崇文区| 军事| 株洲市| 南宫市| 祁门县| 比如县| 福安市| 资源县| 邵武市| 资中县| 南康市| 平乡县| 田林县| 禄丰县| 武乡县| 广丰县| 嘉祥县| 和政县|