欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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í)例

    C#自定義事件及用法實(shí)例

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

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

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

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

    本篇文章是對(duì)C#異步編程進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C#語(yǔ)音識(shí)別用法實(shí)例

    C#語(yǔ)音識(shí)別用法實(shí)例

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

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

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

    c#字符串編碼問(wèn)題的處理解決

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

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

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

    C#檢查遠(yuǎn)程或本地磁盤使用率

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

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

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

    基于XSLT調(diào)試的相關(guān)問(wèn)題

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

最新評(píng)論