C# 利用反射实现 根据字符串获取方法名称并执行(多参,无参)

最近在写一套定时执行的任务,需求很多,要求可以直接传参执行指定的方法及任务。为了方便记录一下小沈的日常生活:

通用类:==》

  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;
            }
        }

 

 

是不是很简单,大家可以尝试一下。

参考了该大佬的文章内容,并简化。

https://blog.csdn.net/lhc1105/article/details/45272939

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值