經過反射找到並執行方法

需求是經過傳入方法的名字,執行該方法,全部的方法都是傳入一個model參數,但model的類型不同。spa

經過上網查資料,整理了一下,具體代碼以下:code

      /// <summary>
        /// 執行方法(方法類型須要是公共的)
        /// </summary>
        /// <returns></returns>
        public ActionResult ExecutionMethod()
        {
            try
            {
                
                #region 經過反射找到方法所屬的類並傳入相應的model執行該方法

                // 1.執行方法的類 Load(命名空間名稱),GetType(命名空間.類名) 
                Type type = Assembly.Load("命名空間名稱").GetType("命名空間名稱.類名");
                // 1.執行方法所須要的model Load(命名空間名稱),GetType(命名空間.類名)
dynamic model = Assembly.Load("命名空間名稱").GetType("命名空間名稱.類名"); // 2.GetMethod(須要調用的方法名稱) MethodInfo method = type.GetMethod("方法名"); // 3.調用的實例化方法(非靜態方法)須要建立類型的一個實例 object obj = Activator.CreateInstance(type); // 3.實例化model dynamic models = Activator.CreateInstance(model); // 4.方法須要傳入的參數,從Session獲取到的參數反序列化爲鍵值對類型 Dictionary<string, object> dic = JsonConvert.DeserializeObject<Dictionary<string, object>>(Session["modelData"].ToString()); // 遍歷傳入的參數鍵值對,並賦值給實例化的model類 foreach (var item in dic) { PropertyInfo _Property = models.GetType().GetProperty(item.Key); if (_Property != null && _Property.CanRead) { //object的數值類型爲Int64須要強制轉換爲Int32 if (item.Value.GetType().ToString() == "System.Int64") { _Property.SetValue(models, Convert.ToInt32(item.Value), null); } else { //給實例化的model賦值 _Property.SetValue(models, item.Value, null); } } }
// 執行查詢方法所須要傳入的參數 object[] parameters = new object[] { models };

          // 5.調用方法,若是調用的是一個靜態方法,就不須要第3步(建立類型的實例) // 相應地調用靜態方法時,Invoke的第一個參數爲null object result = method.Invoke(obj, parameters);
#endregion
return Json(new { IsSuccess = true ,Result = result}, JsonRequestBehavior.AllowGet); }
catch(Exception ex)
{
return Json(new { IsSuccess =
false ,Result = ""}, JsonRequestBehavior.AllowGet); }    }
相關文章
相關標籤/搜索