zoukankan      html  css  js  c++  java
  • 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;
                }
            }    
  • 相关阅读:
    django 修改默认的user表和默认的认证系统
    django 'WSGIRequest' object has no attribute 'user'
    python scrapy简单爬虫记录(实现简单爬取知乎)
    python 文件操作的注意事项
    windows cmd命令
    数据库便捷的软件
    BCB Access violateion at Address 0000 0003. Read of address 0000 0003
    C++Builder6.0 新建和打开项目软件死机
    163邮箱账号
    使用 MtVerify.h头文件 ,用的时候把他头文件的内容添加到项目
  • 原文地址:https://www.cnblogs.com/123qq/p/9687046.html
Copyright © 2011-2022 走看看