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

目录
  • 1、实现
  • 2、创建实例,并执行方法

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 实现流程处理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C# WPF如何反射加载Geometry几何图形数据图标

    相信大家在阅读WPF相关GitHub开源项目源码时都会看见一串串这种数据 这种Geometry数据就是几何图形数据 为什么要用Geometry数据做图标? 有一种做法是使用ttf字体文件代替,不过使用ttf字体文件会出现下面几个缺点: 1.团队协作不便于管理 2.需要依赖特定平台 3.无法灵活使用 而使用Geometry的话,我们可以将这些几何图形数据存入资源字典ResourceDictionary 通过反射进行灵活使用,团队开发可共同维护 怎么获取Geometry数据? 我们进入https:/

  • C# 反射与dynamic最佳组合示例代码

    在 C# 中反射技术应用广泛,至于什么是反射.........你如果不了解的话,请看下段说明,否则请跳过下段.广告一下:喜欢我文章的朋友请关注一下我的blog,这也有助于提高本人写作的动力. 反射:当你背对一个美女或帅哥却不能回头仔细观察研究时(纯属虚构,如有巧合.纯属雷同),一面小镜子就能满足你的需求.在 C# 编程过程中也经常遇到类似的情况:有一个别人写的 dll 类库你想使用却没程序文档资料......此时通过 C# Runtime 提供的功能,你可以把该 dll 类库加载到你的程序中,并

  • 关于C#反射 你需要知道的

    通常,反射用于动态获取对象的类型.属性和方法等信息.今天带你玩转反射,来汇总一下反射的各种常见操作,捡漏看看有没有你不知道的. 获取类型的成员 Type 类的 GetMembers 方法用来获取该类型的所有成员,包括方法和属性,可通过 BindingFlags 标志来筛选这些成员. using System; using System.Reflection; using System.Linq; public class Program { public static voidMain() {

  • 详解C# 反射(Reflection)

    C# 反射(Reflection) 反射指程序可以访问.检测和修改它本身状态或行为的一种能力. 程序集包含模块,而模块包含类型,类型又包含成员.反射则提供了封装程序集.模块和类型的对象. 您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型.然后,可以调用类型的方法或访问其字段和属性. 优缺点 优点: 1.反射提高了程序的灵活性和扩展性. 2.降低耦合性,提高自适应能力. 3.它允许程序创建和控制任何类的对象,无需提前硬编码目标类. 缺点: 1.性能问题:使用反射基本

  • c# 反射+自定义特性保存数据至本地

    最近在项目过程中遇到了保存数据的需求,对实体类的部分数据进行保存,打算采用反射+自定义特性来实现数据保存,利于扩展 1. 采用反射实现能够灵活获取要保存的数据,由于只需要保存实体类(Model)的部分数据,因此采用自定义特性标记需要保存的数据,同时数据要求以.csv格式保存,添加自定义特性有利于对表头进行描述 2. 实现自定义特性 public class ResultAttribute : Attribute { private bool _IsSave; /// <summary> ///

  • C# 通过反射获取类型的字段值及给字段赋值的操作

    举例: 存在一个类: Public Class Student { public string name; public int age; } Student stu1 = new Student(); 现在,我们想通过反射在运行时给stu1的name 和 age字段 赋值,让name = "小明",age = 15,怎么做? 简单的代码如下: ...略 using System.Reflection;//反射类 ...略 static void Main(string[] args)

  • c# 反射用法及效率对比

    反射实例化类 public class Person { public string Name { get; set; } public Person(string name) { this.Name = name; } public string Say(string msg) { return $"{Name}: {msg}"; } } class Program { // 测试次数 const int count = 10000000; static void Main(stri

  • C#中反射和扩展方法如何运用

    前段时间做了一个练手的小项目,名叫Book_Bar,用来卖书的,采用的是三层架构,也就是Models,IDAL,DAL,BLL 和 Web , 在DAL层中各个类中有一个方法比较常用,那就是RowToClass ,顾名思义,也就是将DataTable 中的数据封装到Models 中.结果导致在DAL各个类中写了很多类似的方法,后来就直接把它抽取出来做成了DataTable和DataRow的扩展方法,下面是代码: using System; using System.Collections.Gen

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

    目录 1.实现 2.创建实例,并执行方法 1.实现 这里主要用的是反射的方法.用户要传入方法名和方法参数,我们就需要先写函数返回这些信息,最后再包装一下返回给用户. 获取某一程序集下所有类:(对我来说,获取当前程序集下的类就够了,要获取其他程序集或dll的,请查询其他资料) public List<string> GetClass(string assembyName = null) { Assembly asm = Assembly.GetExecutingAssembly(); var a

  • Golang通脉之流程控制详情

    目录 1.if else(分支结构) 1.1 if条件判断基本写法 1.2 if条件判断特殊写法 2.for(循环结构) 2.1 无限循环 3.for range(键值循环) 4.switch case 5.goto(跳转到指定标签) 6.break(跳出循环) 7.continue(继续下次循环) 前言: 流程控制是每种编程语言控制逻辑走向和执行次序的重要部分,流程控制可以说是一门语言的"经脉". Go语言中最常用的流程控制有if和for,而switch和goto主要是为了简化代码.

  • Go语言流程控制详情

    目录 1.流程控制 2.if 语句 3.goto 4.for语句 5.switch 1.流程控制 流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的流程描述来表达很复杂的逻辑. 流程控制包含分三大类:条件判断,循环控制和无条件跳转. 2.if 语句 if 也许是各种编程语言中最常见的了,它的语法概括起来就是: 如果满足条件就做某事,否则做另一件事. Go 里面 if 条件判断语句中不需要括号,如下代码所示: if x > 10 {     fmt.Println("x i

  • Python执行流程控制 详情

    目录 一 引子 二 分支结构 2.1 什么是分支结构 2.2 为什么要用分支结构 2.3 如何使用分支结构 2.3.1 if语法 2.3.2 if应用案例 三 循环结构 3.1 什么是循环结构 3.2 为什么要用循环结构 3.3 如何使用循环结构 3.3.1 while循环语法 3.3.2 while循环应用案例 3.3.3 for循环语法 3.3.4 for循环应用案例 一 引子 流程控制即控制流程,具体指控制程序的执行流程,而程序的执行流程分为三种结构:顺序结构(之前我们写的代码都是顺序结构

  • 基于Quartz定时调度任务(详解)

    简介 Quarzt是一个项目中定时执行任务的开源项目,Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用,这里我们介绍和spring整合的例子 因为Spring已经整合Quarzt,所以我们只需要配置一下即可. 下载jar包 1.可以直接去http://www.quartz-scheduler.org/ Quarzt的官方网站下载jar包 2.可以通过Maven来构建,记得引入Spring所需要的

  • SpringBoot自动配置Quartz的实现步骤

    目录 1. 依赖信息 1.1 原依赖信息 1.2 新的依赖 1.3 依赖变化 2. 新的依赖使用 2.1 默认配置可用 2.2 使用自动配置 2.3 配置信息: 3. 总结 SpringBoot2.0版本之后,其中增加了对Quartz框架的支持内容,可以实现通过容器来自动配置Quartz. 1. 依赖信息 springboot2.x版本时,出现了spring-boot-starter-quartz这一起步依赖,其中提供了很多丰富功能. 1.1 原依赖信息 之前引入quartz框架时,必须引入的依

  • Java反射使用的详细介绍(最新推荐)

    目录 反射 反射基本介绍 反射获取类对象 反射获取构造器对象 反射获取成员变量对象 反射获取方法对象 反射 反射基本介绍 反射概述: 反射认为类的每一个成份都是一个对象, 对于任何一个Class类,在"运行的时候"都可以直接得到这个类全部成分. 在运行时,可以直接得到这个类的构造器对象:Constructor 在运行时,可以直接得到这个类的成员变量对象:Field 在运行时,可以直接得到这个类的成员方法对象:Method 这种运行时动态获取类信息以及动态调用类中成分的能力称为Java语

  • Vue.js使用$.ajax和vue-resource实现OAuth的注册、登录、注销和API调用

    概述 上一篇我们介绍了如何使用vue resource处理HTTP请求,结合服务端的REST API,就能够很容易地构建一个增删查改应用. 这个应用始终遗留了一个问题,Web App在访问REST API时,没有经过任何认证,这使得服务端的REST API是不安全的,只要有人知道api地址,就可以调用API对服务端的资源进行修改和删除. 今天我们就来探讨一下如何结合Web API来限制资源的访问. 本文的主要内容如下: 介绍传统的Web应用和基于REST服务的Web应用 介绍OAuth认证流程和

  • quarzt定时调度任务解析

    简介 Quarzt是一个项目中定时执行任务的开源项目,Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用,这里我们介绍和spring整合的例子 因为Spring已经整合Quarzt,所以我们只需要配置一下即可. 下载jar包 可以直接去http://www.quartz-scheduler.org/ Quarzt的官方网站下载jar包 可以通过Maven来构建,记得引入Spring所需要的jar

  • Java秒杀系统:web层详解

    目录 设计Restful接口 SpringMVC 项目整合SpringMVC 使用SpringMVC实现Restful接口 逻辑交互 身份认证 计时面板 总结 设计Restful接口 根据需求设计前端交互流程. 三个职位: 产品:解读用户需求,搞出需求文档 前端:不同平台的页面展示 后端:存储.展示.处理数据 前端页面流程: 详情页流程逻辑: 标准系统时间从服务器获取. Restful:一种优雅的URI表述方式.资源的状态和状态转移. Restful规范: GET 查询操作 POST 添加/修改

随机推荐