亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

1、實現(xiàn)

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

獲取某一程序集下所有類:(對我來說,獲取當前程序集下的類就夠了,要獲取其他程序集或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(),來解析出輸入類的名稱的,應該有其他方法可以拿到輸入類的名稱:

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)建實例,并執(zhí)行方法

如果是用放射的方式實例化類,很麻煩的是類的構造函數(shù)中存在依賴關系。于是我才用依賴注入中獲取類的方法。

首先,創(chuàng)建一個IServiceProvider的靜態(tài)類來獲取系統(tǒng)依賴注入中的所有服務,再main函數(shù)中進行獲取和賦值:

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

這樣,就可以避免依賴關系,直接拿依賴注入中的類來反射方法,并執(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);
                  }
            }    

// 模擬某方法進行執(zhí)行
object[] inputArgs = new object[] { Args };
try
{
    var result = method.Invoke(api, inputArgs);
 }
 catch ( Exception ex)
 {
     Console.WriteLine(ex.Message);
 }

這里的Args是通過input類獲取的參數(shù)類型而設置的實例對象,由于invoke的參數(shù)類型為objetc[],所以需要再包裝一層。

method是要調(diào)用的方法,api是該類的實例,從依賴注入中獲取。

總結:

最后就是Quartz的配合,這里就不寫了,可以通過JobDataMap來傳遞參數(shù)。再結合HTTP client,可以實現(xiàn)基本流程處理。既可以調(diào)用內(nèi)部函數(shù),也可以http調(diào)用接口。

到此這篇關于C# 反射與 Quartz 實現(xiàn)流程處理詳情的文章就介紹到這了,更多相關C# 反射與 Quartz 實現(xiàn)流程處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C#自定義事件及用法實例

    C#自定義事件及用法實例

    這篇文章主要介紹了C#自定義事件及用法,實例分析了C#中自定義事件的定義與使用技巧,需要的朋友可以參考下
    2015-05-05
  • .NET的深復制方法(以C#語言為例)

    .NET的深復制方法(以C#語言為例)

    深復制需要將對象實例中字段引用的對象也進行復制,在平時的編程工作中經(jīng)常要用到這種復制方式,下面以c#為例來演示一下方法。
    2016-10-10
  • 深入分析C#異步編程詳解

    深入分析C#異步編程詳解

    本篇文章是對C#異步編程進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C#語音識別用法實例

    C#語音識別用法實例

    這篇文章主要介紹了C#語音識別用法,實例分析了C#利用微軟操作系統(tǒng)自動的語音識別功能,讀取信息的技巧,需要的朋友可以參考下
    2015-01-01
  • C#數(shù)據(jù)結構與算法揭秘四 雙向鏈表

    C#數(shù)據(jù)結構與算法揭秘四 雙向鏈表

    上節(jié)說過這節(jié)會講雙向鏈表,環(huán)形鏈表和應用舉例,我們開始吧!?。?!
    2012-11-11
  • c#字符串編碼問題的處理解決

    c#字符串編碼問題的處理解決

    這篇文章主要介紹了c#字符串編碼問題的處理解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • C#實現(xiàn)同Active MQ通訊的方法

    C#實現(xiàn)同Active MQ通訊的方法

    這篇文章主要介紹了C#實現(xiàn)同Active MQ通訊的方法,簡單分析了Active MQ的功能及C#與之通訊的實現(xiàn)技巧,需要的朋友可以參考下
    2016-07-07
  • C#檢查遠程或本地磁盤使用率

    C#檢查遠程或本地磁盤使用率

    要檢查磁盤的使用情況確定程序放哪個服務器和清理垃圾,所以寫個小程序幫忙檢查。本文給大家介紹C#檢查遠程或本地磁盤使用率的相關知識,感興趣的朋友一起學習吧
    2016-04-04
  • 如何在C#9 中使用頂級程序 (top-level)

    如何在C#9 中使用頂級程序 (top-level)

    這篇文章主要介紹了如何在C#9 中使用頂級程序 (top-level),幫助大家更好的理解和學習使用c#,感興趣的朋友可以了解下
    2021-03-03
  • 基于XSLT調(diào)試的相關問題

    基于XSLT調(diào)試的相關問題

    本篇文章是對XSLT調(diào)試的相關問題進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05

最新評論