反射 —普通类、带泛型的类、带泛型的类与带泛型的方法

  public class GeneralClass
    {

        public string GetName(string name)
        {
            Console.WriteLine($"{name}");
            return $"{name}";
        }
    }
    public class GenericMthod
    {

        public string GetName<T1, T2>(T1 name, T2 sex)
        {
            Console.WriteLine($"{name}{sex}");
            return $"{name}{sex}";
        }
    }
    public class GenericClassAndMethod<T>
    {
        public string GetName<T1, T2>(T1 name, T2 sex)
        {
            Console.WriteLine($"{name}{sex}");
            return $"{name}{sex}";
        }
        public void Get()
        {

        }
    }
    class Program
    {
        static void Main(string[] args)
        {    
            // 普通类/普通方法
            {
                // 获取类
                var type = typeof(GeneralClass);
                //获取方法
                var method = type.GetMethod("GetName");
                // 创建实例
                var obj = Activator.CreateInstance(type);
                // 参数
                var paramaters = new object[] { "111" };
                // 执行             
                method.Invoke(obj, paramaters);
            }

            {
                var type = typeof(GenericMthod);
                var genericMthod = type.GetMethod("GetName");
                // 指定泛型方法中泛型参数的类型 ,这里指定 GetName<T1,T2>中T1 的类型为string,T2为int , 不指定会报错
                var genericMthods = genericMthod.MakeGenericMethod(typeof(string), typeof(int));
                var obj = Activator.CreateInstance(type); // 创建实例
                var paramaters = new object[] { "hnzheng", 11111 }; // 对应的泛型参数值
                genericMthods.Invoke(obj, paramaters); // 执行方法

            }
            {
                var type = typeof(GenericClassAndMethod<>);
               // var genericMthod = type.GetMethod("GetName");
              
                // 创建泛型实例
                var ntype = type.MakeGenericType(typeof(int));//指定GenericClassAndMethod<T> T的类型
                var genericMthod = ntype.GetMethod("GetName");  // 这里要用泛型类型去获取 泛型方法,如果使用type.GetMethod("GetName");会报错
                var obj = Activator.CreateInstance(ntype); // 创建实例

                // 调用非泛型方法
                var method = ntype.GetMethod("Get");
                method.Invoke(obj, null);

                // 调用泛型方法
                 // 指定泛型方法中泛型参数的类型 ,这里指定 GetName<T1,T2>中T1 的类型为string,T2为int , 不指定会报错
                var genericMthodss = genericMthod.MakeGenericMethod(typeof(string), typeof(int));
                //  指定参数 
                var paramaters = new object[] { "hnzheng", 11111 }; // 对应的泛型参数值 
                //genericMthodss.Invoke(null, null);
                genericMthodss.Invoke(obj, paramaters); //


                // 
            }

 1、 mvc 其实 也是利用反射,action重载比较麻烦,无法判断调用那个方法,只能通过httpmethod  来区分

  2、   AOP 

posted @ 2020-04-22 13:54  谁说程序猿很猥琐  阅读(743)  评论(0编辑  收藏  举报