C# 反射与 Quartz 实现流程处理详情
作者:陈子白 时间:2022-11-11 09:11:07
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
调用接口。
来源:https://www.cnblogs.com/chenzibai/p/15273466.html
标签:C#,反射,Quartz
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
java rocketmq--消息的产生(普通消息)
2023-10-19 08:51:50
![](https://img.aspxhome.com/file/2023/4/77054_0s.png)
Spring整合SpringMVC与Mybatis(SSM)实现完整登录功能流程详解
2022-07-15 10:19:25
![](https://img.aspxhome.com/file/2023/2/80842_0s.gif)
Android手势识别器GestureDetector使用详解
2022-01-16 14:25:17
C#编程实现获取文件夹中所有文件的文件名
2022-11-16 07:53:10
Spring中的bean概念介绍
2023-01-18 07:46:49
![](https://img.aspxhome.com/file/2023/3/71863_0s.png)
Java IO学习之缓冲输入流(BufferedInputStream)
2021-10-08 22:30:23
flutter Container容器实现圆角边框
2021-06-17 23:16:23
![](https://img.aspxhome.com/file/2023/1/110731_0s.gif)
Java如何将大文件切割成小文件
2022-12-27 07:40:40
![](https://img.aspxhome.com/file/2023/5/78965_0s.png)
详解Android Activity之间切换传递数据的方法
2021-10-28 04:55:53
![](https://img.aspxhome.com/file/2023/8/87338_0s.png)
Java打印斐波那契前N项的实现示例
2022-12-03 21:18:10
java 工厂模式的讲解及优缺点的介绍
2022-02-05 10:57:09
Android自定义view实现圆形进度条效果
2021-09-12 00:30:03
![](https://img.aspxhome.com/file/2023/4/125374_0s.gif)
详解Java ScheduledThreadPoolExecutor的踩坑与解决方法
2022-11-25 17:34:17
![](https://img.aspxhome.com/file/2023/8/69668_0s.png)
Java设计模式之监听器模式实例详解
2022-10-04 02:51:44
![](https://img.aspxhome.com/file/2023/8/72568_0s.png)
Android onbackpressed实现返回键的拦截和弹窗流程分析
2021-09-11 09:07:22
Android中Listview点击item不变颜色及设置listselector 无效的解决方案
2022-07-04 23:49:10
Android编程实现获取新浪天气预报数据的方法
2022-08-15 22:14:44
Android设计模式系列之组合模式
2023-02-09 16:24:19
![](https://img.aspxhome.com/file/2023/2/139142_0s.jpg)
浅谈C# 中的委托和事件
2021-06-06 18:53:07
![](https://img.aspxhome.com/file/2023/3/88413_0s.gif)
基于C#实现图片合成功能
2022-08-23 07:21:13
![](https://img.aspxhome.com/file/2023/8/89808_0s.png)