反射的妙用-類名方法名作參數進行方法調用實例demo

首先聲明一點,你們都會說反射的效率低下,可是大多數的框架能少了反射嗎?當反射能爲咱們帶來代碼上的方便就能夠用,若有不當之處還望你們指出web

1,項目結構圖以下所示:一個ClassLb類庫項目,一個爲測試用的testReflect的webform項目,testReflect添加對ClassLb類庫項目的引用ajax

2,ClassLb類庫項目中我添加了兩個很是簡單的類,代碼以下框架

public class Class1
    {
        public static string Insert(string a, string b)
        {
            return a + "," + b + "插入成功在Class1中";
        }
        public static string Update(string a, string b)
        {
            return a + "," + b + "更新成功在Class1中";
        }
    }

public class Class2
    {
        public static string Insert(string a, string b)
        {
            return "a,b插入成功在Class2中";
        }
        public static string Update(string a, string b)
        {
            return "a,b更新成功在Class2中";
        }
    }

3,webform項目在Default.aspx.cs中的測試代碼以下:注意,添加命名空間using System.Reflection;測試

        /// <summary>
        /// 獲取類型
        /// </summary>
        /// <param name="assemblyName">程序集名</param>
        /// <param name="typeName">類名</param>
        /// <returns></returns>
        private Type AccessType(string assemblyName, string typeName)
        {

            Type type = null;

            Assembly assembly = Assembly.Load(assemblyName);

            if (assembly == null)

                throw new Exception("Could not find assembly!");

            type = assembly.GetType(assemblyName + "." + typeName);

            if (type == null)

                throw new Exception("Could not find type!");

            return type;

        }
        /// <summary>
        /// 執行方法獲取結果
        /// </summary>
        /// <param name="assemblyName">程序集名</param>
        /// <param name="typeName">類名</param>
        /// <param name="method">方法名</param>
        /// <param name="arguments">方法所需參數</param>
        /// <returns></returns>
        public object ExecuteMethod(string assemblyName, string typeName, string method, params object[] arguments)
        {

            object returnObject = null;

            Type type = AccessType(assemblyName, typeName);

            returnObject = type.InvokeMember(method, BindingFlags.Default | BindingFlags.InvokeMethod, null, null, arguments);

            return returnObject;

        }

4,測試代碼以下:spa

protected void Page_Load(object sender, EventArgs e)
        {

            string a = ExecuteMethod("ClassLb", "Class1", "Insert", "sxd", "123").ToString();
            Response.Write(a + "</br>");
            string b = ExecuteMethod("ClassLb", "Class1", "Update", "sxd", "123").ToString();
            Response.Write(b + "</br>");
            string c = ExecuteMethod("ClassLb", "Class2", "Insert", "sxd", "123").ToString();
            Response.Write(c + "</br>");
            string d = ExecuteMethod("ClassLb", "Class2", "Update", "sxd", "123").ToString();
            Response.Write(d + "</br>");
        }

5,執行結果:code

6,心得體會,我作的上一個項目用到的是Jquery經過ajax調用webservice,webservice調用類庫方法,每個對象基本都有增刪改查操做,我在webservice中就要建四個操做的方法供ajax調用,寫了不少的webservice,每一個webservice又有好幾個方法,浪費了不少的時間,當我用上面所示的反射的時候只需用一個webservice,一個方法,前臺ajax調用的時候給我傳入相應的參數便可,這樣會大大提升開發速度,這只是個人一點體會,若是你們有更好的方法請一塊兒跟你們分享orm

相關文章
相關標籤/搜索