• 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)

  • 相关阅读:
    浅谈Java两种并发类型——计算密集型与IO密集型
    设置线程池的大小
    Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecuto
    gitlab的简单操作
    GitHub vs GitLab:区别?
    前端小知识汇总
    花里胡哨的CSS集锦
    码云如何上传代码
    小程序自定义底部导航
    Vue实践过程中的几个问题
  • 原文地址:https://www.cnblogs.com/sanyejun/p/8575458.html
Copyright © 2020-2023  润新知