zoukankan      html  css  js  c++  java
  • c#输入方法名来调用方法(反射)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Reflection;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace zhiXing
    {
        class Program
        {
            static void Main(string[] args)
            {
                //方法1
                /*
                Type t = typeof(TestA);
                MethodInfo mt = t.GetMethod("My");
                TestA ta = new TestA();
                string str = (string)mt.Invoke(ta, new object[] { 5 });
                */
                
                //方法2
                //加载程序集
                Assembly s = Assembly.Load("zhiXing");
                //得到类
                Type tpe = s.GetType("zhiXing.TestA");
                //得到方法
                MethodInfo method = tpe.GetMethod("My");
                //安全判断
                {
                    //获取需要传入的参数
                    ParameterInfo[] parms = method.GetParameters();
                    //这里是判断参数类型
                    foreach (ParameterInfo ss in parms)
                    {
                        if (ss.ParameterType == typeof(int))
                        {
                            Console.WriteLine("参数类型匹配");
                        }
                        else
                        {
                            Console.WriteLine("参数类型不匹配");
                        }
                    }
                }
                //获取 类的对象
                object obj = s.CreateInstance("zhiXing.TestA");
                //调用
                method.Invoke(obj, new object[] { 5 });
                
            }
        }
    
        public class TestA
        {
            public void My(int a)
            {
                Console.WriteLine("哈哈哈哈哈" + a);
                Console.ReadKey();
            }
        }
    
    }

    =================================================================================================

    方法1其实已经实现了,在一个自己的类中,输入自己的方法名来执行函数

    实例

    public class Execute : MonoBehaviour {
    
        // Use this for initialization
        void Start () {
            Type t = typeof(Execute);
    //获取共有方法 MethodInfo mt
    = t.GetMethod("My");
         //获取私有方法, BindingFlags类型枚举,BindingFlags.NonPublic | BindingFlags.Instance 组合才能获取到private私有方法,
         //MethodInfo mt = t.GetMethod("My", BindingFlags.NonPublic | BindingFlags.Instance);
            //若公有和私有都要的话  BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public
         string str = (string)mt.Invoke(this, new object[] { 5 });
        }
        
        // Update is called once per frame
        void Update () {
            
        }
    
        public void My(int a)
        {
            Debug.Log("哈哈哈");
        }
    }

    【反射的官方中文文档】

    https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/concepts/reflection

    有个最简单的办法:  Invoke("mothodName", 0)

  • 相关阅读:
    python day1
    Vue与react的择决
    CommonJS规范
    js面向对象的程序设计
    正则匹配所有的a标签
    js-静态、原型、实例属性
    js中参数不对应问题
    sublime常用快捷键
    JSON.parse()和JSON.stringify()
    setAttribute()
  • 原文地址:https://www.cnblogs.com/sanyejun/p/8575458.html
Copyright © 2011-2022 走看看