C# 反射调用方法

     /// <summary>
        /// 转换参数
        /// </summary>
        /// <param name="paras"></param>
        /// <returns></returns>
        public Dictionary<string, string> JosnToDictionary(string paras)
        {
            Dictionary<string, string> dictionaryPara = new Dictionary<string, string>();
            if (!string.IsNullOrEmpty(paras))
            {
                JObject jobj = JObject.Parse(paras);
                JToken jsonResult = jobj as JToken;
                foreach (JProperty item in jsonResult)
                {
                    dictionaryPara.Add(item.Name, item.Value.ToString());
                }
            }
            return dictionaryPara;
        }

 

 

 

       /// <summary>
        /// 反射执行方法
        /// </summary>
        /// <param name="assemblyName"></param>
        /// <param name="instPath"></param>
        /// <param name="methodName"></param>
        /// <param name="paras"></param>
        /// <returns></returns>
        public object AssemblyClass(string assemblyName, string instPath, string methodName, string paras, ref string errorMsg)
        {
            try
            {
                //解析程序集名称
                List<string> assemblyNameList = new List<string>();
                if (!string.IsNullOrEmpty(assemblyName))
                {
                    assemblyNameList = assemblyName.Split(',').ToList();
                }
                //解析参数
                Dictionary<string, string> dictionaryPara = JosnToDictionary(paras);
                //dll文件路径
                string baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
                string loadFile = AppDomain.CurrentDomain.BaseDirectory + "/" + assemblyNameList[0] + ".dll";
                Assembly assembly = Assembly.LoadFile(loadFile);
                Type type = assembly.GetType(instPath);
                object instance = assembly.CreateInstance(instPath);
                MethodInfo[] info = type.GetMethods();
                Type[] params_type = null;
                Object[] params_obj = null;
                for (int i = 0; i < info.Length; i++)
                {
                    var md = info[i];
                    if (md.Name == methodName)
                    {
                        //参数集合
                        ParameterInfo[] paramInfos = md.GetParameters();
                        params_obj = new Object[paramInfos.Length];
                        params_type = new Type[paramInfos.Length];
                        foreach (var item in paramInfos)
                        {
                            foreach (var itemp in dictionaryPara)
                            {
                                if (item.Name == itemp.Key)
                                {
                                    var propertyType = Nullable.GetUnderlyingType(item.ParameterType) ?? item.ParameterType;
                                    params_type[item.Position] = propertyType;
                                    if (propertyType.Name == "DateTime")
                                    {
                                        if (!string.IsNullOrEmpty(itemp.Value))
                                        {
                                            params_obj[item.Position] = DateTime.Parse(itemp.Value);
                                        }
                                        else
                                        {
                                            params_obj[item.Position] = null;
                                        }
                                    }
                                    else
                                    {
                                        params_obj[item.Position] = !string.IsNullOrEmpty(itemp.Value) ? itemp.Value : "";
                                    }
                                    break;
                                }
                            }
                        }
                        break;
                    }
                }
                object value = type.GetMethod(methodName, params_type).Invoke(instance, params_obj);
                return value;
            }
            catch (Exception ex)
            {
                errorMsg = ex.Message;
                return null;
            }
        }    

 

posted @ 2019-03-11 21:27  木头马尾、、、  阅读(2600)  评论(0编辑  收藏  举报