C# 反射与 Quartz 实现流程处理详情

 更新时间:2021年09月16日 09:48:43   作者:陈子白  
根据要实现流程处理,比如用户可以定义一个定时任务,每周一查看报表。任务是用Quartz可实现,但用户自己选择报表就比较麻烦,这时因为系统的不同模块的生成报表的函数不同,这时便可以传入一个方法名和方法的输入参数,就可以调用该方法。下面小编我为大家介绍具体过程

1、实现

这里主要用的是反射的方法。用户要传入方法名和方法参数,我们就需要先写函数返回这些信息,最后再包装一下返回给用户。

获取某一程序集下所有类:(对我来说,获取当前程序集下的类就够了,要获取其他程序集或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();
        }


获取某一个方法的传入参数类型,我是通过把method直接tostring(),来解析出输入类的名称的,应该有其他方法可以拿到输入类的名称:

public List<string> GetParameter(MethodInfo methodInfo, Assembly assembly)
        {
            // 由方法获取输入类,创建类
            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、创建实例,并执行方法

如果是用放射的方式实例化类,很麻烦的是类的构造函数中存在依赖关系。于是我才用依赖注入中获取类的方法。

首先,创建一个IServiceProvider的静态类来获取系统依赖注入中的所有服务,再main函数中进行获取和赋值:

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

这样,就可以避免依赖关系,直接拿依赖注入中的类来反射方法,并执行:

    // 获取依赖注入中类
     var api = ServiceHelper.Instance.GetService(do_class);    


这里的do_class是一个Type

最后,是使用invoke来执行方法:

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

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

这里的Args是通过input类获取的参数类型而设置的实例对象,由于invoke的参数类型为objetc[],所以需要再包装一层。

method是要调用的方法,api是该类的实例,从依赖注入中获取。

总结:

最后就是Quartz的配合,这里就不写了,可以通过JobDataMap来传递参数。再结合HTTP client,可以实现基本流程处理。既可以调用内部函数,也可以http调用接口。

到此这篇关于C# 反射与 Quartz 实现流程处理详情的文章就介绍到这了,更多相关C# 反射与 Quartz 实现流程处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C# 泛型的约束

    C# 泛型的约束

    本文将详细介绍C# 泛型的约束:引用类型约束;值类型约束;构造函数类型约束;转换类型约束;组合约束的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • C#通过IComparable实现ListT.sort()排序

    C#通过IComparable实现ListT.sort()排序

    这篇文章主要介绍了C#通过IComparable实现ListT.sort()排序的方法,可实现自定义的排序方法,是非常实用的技巧,需要的朋友可以参考下
    2014-09-09
  • Unity3D实现物体闪烁效果

    Unity3D实现物体闪烁效果

    这篇文章主要为大家详细介绍了Unity3D实现物体闪烁效果,类似霓虹灯、跑马灯、LED灯效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • C#递归题目实例代码

    C#递归题目实例代码

    这篇文章主要介绍了C#递归题目实例代码,有需要的朋友可以参考一下
    2014-01-01
  • C#基于socket模拟http请求的方法

    C#基于socket模拟http请求的方法

    这篇文章主要介绍了C#基于socket模拟http请求的方法,实例分析了socket模拟http请求的实现技巧,需要的朋友可以参考下
    2015-06-06
  • C#数据结构之顺序表(SeqList)实例详解

    C#数据结构之顺序表(SeqList)实例详解

    这篇文章主要介绍了C#数据结构之顺序表(SeqList)实现方法,结合实例形式较为详细的分析了顺序表的定义、原理与具体实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • C#非矩形窗体实现方法

    C#非矩形窗体实现方法

    这篇文章主要介绍了C#非矩形窗体实现方法,涉及C#窗体操作的相关技巧,需要的朋友可以参考下
    2015-06-06
  • C#画笔Pen用法实例

    C#画笔Pen用法实例

    这篇文章主要介绍了C#画笔Pen用法,实例分析了画笔Pen绘制图形的相关技巧,需要的朋友可以参考下
    2015-06-06
  • WPF实现钟表效果

    WPF实现钟表效果

    这篇文章主要为大家详细介绍了WPF实现钟表效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • C#多线程系列之多线程锁lock和Monitor

    C#多线程系列之多线程锁lock和Monitor

    这篇文章介绍了C#多线程锁lock和Monitor的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02

最新评论