C#|C# 反射与 Quartz 实现流程处理详情
目录
- 1、实现
- 2、创建实例,并执行方法
1、实现 这里主要用的是反射的方法。用户要传入方法名和方法参数,我们就需要先写函数返回这些信息,最后再包装一下返回给用户。
获取某一程序集下所有类:(对我来说,获取当前程序集下的类就够了,要获取其他程序集或dll的,请查询其他资料)
public List GetClass(string assembyName = null){Assembly asm = Assembly.GetExecutingAssembly(); var allclass = asm.ExportedTypes.ToList(); return allclass.Select(u => u.Name).ToList(); }
获取某一个类中所有的方法,主要用到
GetMethods()
的方法:public List GetMethod(Type type,string assembyName = null){// 测试获取指定类的方法,去除自带的GetType方法Listmethods = 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 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 result = new List(); 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#|C# 反射与 Quartz 实现流程处理详情】到此这篇关于C# 反射与 Quartz 实现流程处理详情的文章就介绍到这了,更多相关C# 反射与 Quartz 实现流程处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- Docker应用:容器间通信与Mariadb数据库主从复制
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量
- 第326天
- Shell-Bash变量与运算符
- 逻辑回归的理解与python示例
- Guava|Guava RateLimiter与限流算法
- 我和你之前距离
- CGI,FastCGI,PHP-CGI与PHP-FPM
- 原生家庭之痛与超越