• 反射学习


    什么是反射?

    很多时候被问到什么是反射时,都说不出一个准确的定义。那什么是反射呢,其实我们在使用vs编译器的智能提示,就是通过反射获取到类的属性、方法等。

    还有反编译工具也是通过反射实现

    反射就是动态获取程序集的元数据的功能。

    反射:就是动态获取程序集中的元数据来操作类型的。(简单的理解就是通过类型元数据创建对象、调用对象成员等)

    Type类的介绍

      Type类是反射的一个重要的类,通过它我们可以获取类中的所有信息包括方法、属性等,可以动态调用类的属性、方法。

         

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Reflection;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication3
    {
        class Program
        {
            static void Main(string[] args)
            {
                //对Type的介绍
                //1.获取一个类型的Type(该类型的类型元数据)
                MyClass m = new MyClass();
                Type type1 = m.GetType();//获得了类型MyClass对应的Type.
    
                //没有创建MyClass对象,通过typeof关键字
                Type type2 = typeof(MyClass);
                //获取该当前类型的父类
                Console.WriteLine(type2.BaseType.ToString());
                //Console.WriteLine(type2.BaseType.BaseType.ToString());
               // Console.WriteLine(type2.BaseType.BaseType.BaseType.ToString());
               
               // //字段信息(public)
                FieldInfo[] a = type2.GetFields();
                for (int i = 0; i < a.Length; i++) 
                {
                    Console.WriteLine(a[i].Name);
    
                }
                //属性获取
                PropertyInfo[] pro = type2.GetProperties();
    
                for (int i = 0; i < pro.Length; i++) {
    
                    Console.WriteLine(pro[i].Name);
                }
    
               //获取方法
               MethodInfo [] method  =   type2.GetMethods();
            for (int i = 0; i < method.Length; i++)
           {
               Console.WriteLine(method[i].Name);
           }
    
                    Console.ReadKey();
    
    
    
            }
        }
    
        class MyClass {
    
            public string[] member;
            public string[] student;
    
            public string name
            {
                get;
                set;
            }
            public string Email
            {
    
                get;
                set;
            }
            public int age
            {
                get;
                set;
            }
            public void Say() {
    
                Console.WriteLine("早安,你好");
            }
            private void SayHello() {
                Console.Write("你在哪里啊");
            
            
            }
        }
    }

    动态加载程序集

    创建一个testDll类库找到编译生成的dll

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace testDll
    {
        public class Person
        {
            public Person() { }
    
            public Person(string name , int age, string sex) {
    
                this.name = name;
                this.age = age;
                this.sex= sex;
            
            }
    
                public string name
                {
                    get;
                    set;
    
                }
                public int age
                {
                    get;
                    set;
                }
                public string sex
                {
    
                    get;
                    set;
                }
                public void SayHi()
                {
                    Console.WriteLine("Hi~~~~");
                }
    
                public void SayHello(string msg) {
    
                    Console.WriteLine(msg);
    
                }
                public void SayHello() {
    
                    Console.WriteLine("hi,我是SayHello的无参重载方法。");
                }
                public int Add(int n1, int n2) {
    
                    return n1 +n2;
                }
            
        }
    
        public interface IFlyable {
    
            void Fly();
        }
        public class Student : Person{
        
        
        }
        internal class Teacher : Person { 
        
        
        }
    
        public class MyClass1 : IFlyable {
    
            #region IFlyable 成员
    
            public void Fly()
            {
                throw new NotImplementedException();
            }
    
            #endregion
        }
        public delegate void  a();
        public struct Mystruct { 
        
        }
        public enum MyEnum { 
        
        
        }
    }
    

      根据程序的路径,动态加载一个程序集

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Reflection;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
    
                //动态加载程序集并且调用类型成员
                //根据程序的路径,动态加载一个程序集
                Assembly myAssembly = Assembly.LoadFile(@"C:UsersAdministratorDesktopplm_20181031plmConsoleApplication1	estDllinDebug	estDll.dll");
    
    
              //// 1.获取程序集中的所有类型
              //  Type[] type1 = myAssembly.GetTypes();
              //  for (int i = 0; i < type1.Length; i++)
              //  {
              //      Console.WriteLine(type1[i].FullName);
              //  }
                //2.获取所有的public的类型
                //Type[] type = myAssembly.GetExportedTypes();
    
                //for (int i = 0; i <type.Length; i++)
                //{
                //    Console.WriteLine(type[i].FullName);
                //}
                //获取指定类型
                //获取person类型的type
                Type typePerson = myAssembly.GetType("testDll.Person");
                //调用Person类中的方法
                //调用SayHi方法
              //  MethodInfo method = typePerson.GetMethod("SayHi");
              ////创建一个Person 类型的对象
              //  object  obj = Activator.CreateInstance(typePerson);
                
              //  //调用方法
              //  method.Invoke(obj, null);
                //MethodInfo method = typePerson.GetMethod("SayHello", new Type[] { typeof(string) });
                //method.Invoke(Activator.CreateInstance(typePerson), new object[] { "大家好。。。。" });
                //如果有返回值,就直接接受invoke的返回值
               
                
                
                //通过调用指定的构造函数来创建对象
         ConstructorInfo info = typePerson.GetConstructor(new Type []{typeof(string ),typeof(int ), typeof(string )});
                //调用构造函数来创建对象
         object obj = info.Invoke(new object[]{"张正",20,""});
                //通过反射获取指定对象的属性值
            PropertyInfo pinfo =  typePerson.GetProperty("name");
          string name =  pinfo.GetValue(obj, null).ToString();
          Console.WriteLine(name);
                Console.ReadKey();
            }
    
    
    
        }
    
    }
  • 相关阅读:
    如何在Kubernetes集群动态使用 NAS 持久卷
    如何在Kubernetes集群动态使用 NAS 持久卷
    谷歌浏览器报错Unchecked runtime.lastError: The message port closed before a response was received.。
    优化信息流很麻烦?三招教你轻松搞定
    优化信息流很麻烦?三招教你轻松搞定
    java多线程
    java多线程
    酷狗音乐快速转换MP3格式的方法
    Golang项目部署
    解析HTML、JS与PHP之间的数据传输
  • 原文地址:https://www.cnblogs.com/Vinkong/p/9973754.html
Copyright © 2020-2023  润新知