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

  • 相关阅读:
    计算机算法设计与分析之棋盘覆盖问题
    在uboot里面加入环境变量使用run来运行
    软件project师的属性与发展
    Oracle 表三种连接方式(sql优化)
    POJ 1700 cross river (数学模拟)
    八:Java之I/O
    为 Python Server Pages 和 Oracle 构建快速 Web 开发环境。
    WebBot
    WebBrowserProgramming
    Skulpt
  • 原文地址:https://www.cnblogs.com/xielong/p/9561875.html
Copyright © 2011-2022 走看看