zoukankan      html  css  js  c++  java
  • C#如何通过反射调用类下的方法

    首先模拟一个mvc的项目,创建一个业务类(HomeService),在类下创建3个方法

     public class HomeService
        {
            /// <summary>
            /// 无参方法
            /// </summary>
            /// <returns></returns>
            public string SayHello() {
                string str = "你好!";
                return str;
            }
    
            /// <summary>
            /// 有参方法(1个)
            /// </summary>
            /// <param name="name"></param>
            /// <returns></returns>
            public string SayHello(string name)
            {
                string str = "你好," + name + "!";
                return str;
            }
    
            /// <summary>
            /// 有参方法(2个)
            /// </summary>
            /// <param name="name"></param>
            /// <returns></returns>
            public string SayHello(string name,int age)
            {
                string str = "你好," + name + ",你已经"+ age +"岁!";
                return str;
            }
        }

    1、正常方式调用类的方法

    /// <summary>
            /// 正常调用类的方法(parm1)
            /// </summary>
            /// <returns></returns>
            public string GetNormalMethod_2()
            {
                HomeService service = new HomeService();         
                //调用有参方法(name)
                string result = service.SayHello("李天");
                //输出调用信息
                string strs = GetInvokeInfo("SayHello(string name)", result);
                return strs;
            }
    

    2、反射方式调用类的方法

    /// <summary>
            /// 通过反射调用类的方法(SayHello(string name))
            /// </summary>
            public string GetInvokeMethod_2()
            {
                // 1.Load(命名空间名称),GetType(命名空间.类名)
                Type type = Assembly.Load("StudyInvokeMethod").GetType("StudyInvokeMethod.HomeService");
                //2.GetMethod(需要调用的方法名称)
                MethodInfo method = type.GetMethod("SayHello", new Type[] { typeof(string) });
                // 3.调用的实例化方法(非静态方法)需要创建类型的一个实例
                object obj = Activator.CreateInstance(type);
                //4.方法需要传入的参数
                object[] parameters = new object[] { "李天"};
                // 5.调用方法,如果调用的是一个静态方法,就不需要第3步(创建类型的实例)
                // 相应地调用静态方法时,Invoke的第一个参数为null
                string result = (string)method.Invoke(obj, parameters);
    
                //输出调用信息
                string strs = GetInvokeInfo("SayHello(string name)", result);
                return strs;
            }
        

    3、调用代码

     public ActionResult Index()
            {
                /***** 通过正常调用类的方法 *****/
    
                //1)通过正常调用方法(无参)
                string arg1 = GetNormalMethod_1();
                //2)通过正常调用方法(参1)
                string arg2 = GetNormalMethod_2();
                //3)通过正常调用方法(参1,参2)
                string arg3 = GetNormalMethod_3();
    
             
                /*****通过反射调用类的方法*****/
    
                //1)通过反射调用方法(无参)
                string str1 = GetInvokeMethod_1();
                //2)通过反射调用方法(参1)
                string str2 = GetInvokeMethod_2();
                //2)通过反射调用方法(参1,参2)
                string str3 = GetInvokeMethod_3();
    
                return View();
            }

    4、调用结果

    5、全部代码

    1)Service类

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    namespace StudyInvokeMethod
    {
        public class HomeService
        {
            /// <summary>
            /// 无参方法
            /// </summary>
            /// <returns></returns>
            public string SayHello() {
                string str = "你好!";
                return str;
            }
    
            /// <summary>
            /// 有参方法(1个)
            /// </summary>
            /// <param name="name"></param>
            /// <returns></returns>
            public string SayHello(string name)
            {
                string str = "你好," + name + "!";
                return str;
            }
    
            /// <summary>
            /// 有参方法(2个)
            /// </summary>
            /// <param name="name"></param>
            /// <returns></returns>
            public string SayHello(string name,int age)
            {
                string str = "你好," + name + ",你已经"+ age +"岁!";
                return str;
            }
        }
    }

    2)控制器调用

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Reflection;
    using System.Web;
    using System.Web.Mvc;
    
    namespace StudyInvokeMethod.Controllers
    {
        public class HomeController : Controller
        {
            public ActionResult Index()
            {
                /***** 通过正常调用类的方法 *****/
    
                //1)通过正常调用方法(无参)
                string arg1 = GetNormalMethod_1();
                //2)通过正常调用方法(参1)
                string arg2 = GetNormalMethod_2();
                //3)通过正常调用方法(参1,参2)
                string arg3 = GetNormalMethod_3();
    
             
                /*****通过反射调用类的方法*****/
    
                //1)通过反射调用方法(无参)
                string str1 = GetInvokeMethod_1();
                //2)通过反射调用方法(参1)
                string str2 = GetInvokeMethod_2();
                //2)通过反射调用方法(参1,参2)
                string str3 = GetInvokeMethod_3();
    
                return View();
            }
    
    
            /// <summary>
            /// 正常调用类的方法
            /// </summary>
            /// <returns></returns>
            public string GetNormalMethod_1() {
                HomeService service = new HomeService();
                //调用无参方法
                string result = service.SayHello();
                //输出调用信息
                string strs = GetInvokeInfo("SayHello()", result);
                return strs;
            }
    
            /// <summary>
            /// 正常调用类的方法(parm1)
            /// </summary>
            /// <returns></returns>
            public string GetNormalMethod_2()
            {
                HomeService service = new HomeService();         
                //调用有参方法(name)
                string result = service.SayHello("李天");
                //输出调用信息
                string strs = GetInvokeInfo("SayHello(string name)", result);
                return strs;
            }
    
            /// <summary>
            /// 正常调用类的方法(parm1,parm2)
            /// </summary>
            /// <returns></returns>
            public string GetNormalMethod_3()
            {
                HomeService service = new HomeService();
                //调用有参方法(name,age)
                string result = service.SayHello("李天", 20);
                //输出调用信息
                string strs = GetInvokeInfo("SayHello(string name,int age)", result);
                return strs;
            }
    
            /// <summary>
            /// 通过反射调用类的方法(SayHello())
            /// </summary>
            public string GetInvokeMethod_1() {
    
                // 1.Load(命名空间名称),GetType(命名空间.类名)
                Type type = Assembly.Load("StudyInvokeMethod").GetType("StudyInvokeMethod.HomeService");
                //2.GetMethod(需要调用的方法名称)
                MethodInfo method = type.GetMethod("SayHello", new Type[] { });
                // 3.调用的实例化方法(非静态方法)需要创建类型的一个实例
                object obj = Activator.CreateInstance(type);          
                //4.方法需要传入的参数
                object[] parameters = new object[] { };
                // 5.调用方法,如果调用的是一个静态方法,就不需要第3步(创建类型的实例)
                // 相应地调用静态方法时,Invoke的第一个参数为null
                string result = (string)method.Invoke(obj, parameters);
    
                //输出调用信息
                string strs = GetInvokeInfo("SayHello()", result); 
                return strs;        
            }
    
            /// <summary>
            /// 通过反射调用类的方法(SayHello(string name))
            /// </summary>
            public string GetInvokeMethod_2()
            {
                // 1.Load(命名空间名称),GetType(命名空间.类名)
                Type type = Assembly.Load("StudyInvokeMethod").GetType("StudyInvokeMethod.HomeService");
                //2.GetMethod(需要调用的方法名称)
                MethodInfo method = type.GetMethod("SayHello", new Type[] { typeof(string) });
                // 3.调用的实例化方法(非静态方法)需要创建类型的一个实例
                object obj = Activator.CreateInstance(type);
                //4.方法需要传入的参数
                object[] parameters = new object[] { "李天"};
                // 5.调用方法,如果调用的是一个静态方法,就不需要第3步(创建类型的实例)
                // 相应地调用静态方法时,Invoke的第一个参数为null
                string result = (string)method.Invoke(obj, parameters);
    
                //输出调用信息
                string strs = GetInvokeInfo("SayHello(string name)", result);
                return strs;
            }
    
            /// <summary>
            /// 通过反射调用类的方法(SayHello(string name,int age))
            /// </summary>
            public string GetInvokeMethod_3()
            {
                // 1.Load(命名空间名称),GetType(命名空间.类名)
                Type type = Assembly.Load("StudyInvokeMethod").GetType("StudyInvokeMethod.HomeService");
                //2.GetMethod(需要调用的方法名称)
                MethodInfo method = type.GetMethod("SayHello", new Type[] { typeof(string),typeof(int) });
                // 3.调用的实例化方法(非静态方法)需要创建类型的一个实例
                object obj = Activator.CreateInstance(type);
                //4.方法需要传入的参数
                object[] parameters = new object[] { "李天",18};
                // 5.调用方法,如果调用的是一个静态方法,就不需要第3步(创建类型的实例)
                // 相应地调用静态方法时,Invoke的第一个参数为null
                string result = (string)method.Invoke(obj, parameters);
    
                //输出调用信息
                string strs = GetInvokeInfo("SayHello(string name,int age)", result);
                return strs;
            }
    
            /// <summary>
            /// 调用方法输出信息
            /// </summary>
            /// <param name="method">调用方法名</param>
            /// <param name="str">返回信息</param>
            /// <returns></returns>
            public string GetInvokeInfo(string method, string str)
            {
                string result = string.Format("调用方法:{0},输出:{1}", method, str);
                return result;
            }
        }
    }

    PS:

    参考网址:https://blog.csdn.net/likekobe2012/article/details/41824285

  • 相关阅读:
    POJ 2175 Evacuation Plan 费用流 负圈定理
    POJ 2983 Is the Information Reliable? 差分约束
    codeforces 420B Online Meeting
    POJ 3181 Dollar Dayz DP
    POJ Ant Counting DP
    POJ 1742 Coins DP 01背包
    中国儒学史
    产品思维30讲
    Java多线程编程核心技术
    编写高质量代码:改善Java程序的151个建议
  • 原文地址:https://www.cnblogs.com/xielong/p/9561875.html
Copyright © 2011-2022 走看看