最近在写一套定时执行的任务,需求很多,要求可以直接传参执行指定的方法及任务。为了方便记录一下小沈的日常生活:
通用类:==》
public class TimedTaskServices<T>
{
private readonly T _jobServices;
public TimedTaskServices(T instance)
{
_jobServices = instance;
}
/// <summary>
/// 根据方法名称获取方法并执行(无参)
/// </summary>
/// <param name="methodName">方法名</param>
public void InvokeMethod(string methodName)
{
try
{
if (methodName == null || methodName == "") return;
var minfo = typeof(T).GetMethod(methodName);
if (minfo == null) throw new ArgumentNullException("找不到资源");
minfo.Invoke(_jobServices, null);
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 根据方法名称获取方法并执行(多参)
/// </summary>
/// <param name="methodName">方法名</param>
/// <param name="objParam">动参</param>
public void InvokeMethodWithParam(string methodName, object[] objParam)
{
try
{
if (methodName == null || methodName == "") return;
var methodInfo = typeof(T).GetMethod(methodName);
//var minfoInfo_Param = methodInfo.GetParameters();可获取对应参数进行分别赋值
if (methodInfo == null) throw new ArgumentNullException("找不到资源");
methodInfo.Invoke(_jobServices, objParam);
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 获取类下所有方法名及参数
/// </summary>
/// <returns></returns>
public Dictionary<string, ParameterInfo[]> GetClassMethods()
{
try
{
var result = new Dictionary<string, ParameterInfo[]>();
var allMethods = typeof(T).GetMethods();
foreach (MethodInfo meth in allMethods)
{
result.Add(meth.Name, meth.GetParameters());
}
return result;
}
catch (Exception ex)
{
throw ex;
}
}
}
包装了泛型的方法为了更方便的在所有项目都可调用;
接下来看如何使用
private readonly static JobServices instance = new JobServices();--实例化自己需要查询或执行的类
TimedTaskServices<JobServices> _timedTaskServicesJob = new TimedTaskServices<JobServices>(instance);
--实例化通用类并构造
/// 即可使用
public async Task<Dictionary<string, ParameterInfo[]>> GetJobMethods()
{
try
{
return _timedTaskServicesJob.GetClassMethods();
}
catch (Exception ex)
{
throw ex;
}
}
是不是很简单,大家可以尝试一下。
参考了该大佬的文章内容,并简化。