C# 反射与 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 实现流程处理内容请搜索编程教程以前的文章,希望大家多多支持编程教程

Unity Shader是着色器,将纹理、网格信息输入,得到材质的一段程序,具体是个什么东西,还需要亲自实践才知道。效果图:shader被附给了球。灯光需要在属性面板开启阴影。// Upgrad ...