zoukankan      html  css  js  c++  java
  • 反射

    概括:通过动态加载程序集,获取类型,创建对象,并调用成员。

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

    1、获取一个类型的Type(该类型的类型元数据)

    方式一:

    1         private void button1_Click(object sender, EventArgs e)
    2         {
    3             MyClass m = new MyClass();
    4             Type t = m.GetType(); //获取了类型MyClass对应的Type
    5         }
    1     public class MyClass
    2     {
    3         public string Name { get; set; }
    4         public void Say()
    5         {
    6             MessageBox.Show("Hi");
    7         }
    8     }

    方式二:

    1         private void button1_Click(object sender, EventArgs e)
    2         {
    3             Type t = typeof(MyClass);  //通过Typeof关键字,无需获取MyClass类型的对象就可以拿到MyClass的Type对象
    4         }
    1     public class MyClass
    2     {
    3         public string Name { get; set; }
    4         public void Say()
    5         {
    6             MessageBox.Show("Hi");
    7         }
    8     }

     2、获取当前类型的父类是谁?

    1         private void button1_Click(object sender, EventArgs e)
    2         {
    3             Type t = typeof(MyClass);
    4             MessageBox.Show(t.BaseType.ToString());
    5         }
     1     public class MyClass
     2     {
     3         public string Name { get; set; }
     4         public void Say()
     5         {
     6             MessageBox.Show("Hi");
     7         }
     8         private void SayHell()
     9         {
    10             MessageBox.Show("Hello");
    11         }
    12     }

    3、获取当前类型中的所有的字段信息

     1         private void button1_Click(object sender, EventArgs e)
     2         {
     3             Type t = typeof(MyClass);
     4             MessageBox.Show(t.GetField("arrStr").ToString()); //获取指定的字段
     5             FieldInfo[] fileds = t.GetFields(); //获取所有的字段信息
     6             for (int i = 0; i < fileds.Length; i++)
     7             {
     8                 MessageBox.Show(fileds[i].ToString());
     9                 MessageBox.Show(fileds[i].Name.ToString()); //获取当前成员的名称
    10                 MessageBox.Show(fileds[i].IsStatic.ToString()); //获取当前成员是否static修饰
    11                 MessageBox.Show(fileds[i].ReflectedType.Name.ToString()); //获取类的名字
    12                 MessageBox.Show(fileds[i].IsPublic.ToString()); //获取当前成员是否public修饰
    13                 MessageBox.Show(fileds[i].IsPrivate.ToString()); //获取当前成员是否private修饰
    14                 MessageBox.Show(fileds[i].FieldType.ToString()); //获取字段类型
    15                 MessageBox.Show(fileds[i].DeclaringType.ToString()); //获取声明该成员的类名称
    16             }
    17         }
     1     public class MyClass
     2     {
     3         public string[] arrStr;
     4         public int Age { get; set; }
     5         public string Name { get; set; }
     6         public void Say()
     7         {
     8             MessageBox.Show("Hi");
     9         }
    10         private void SayHell()
    11         {
    12             MessageBox.Show("Hello");
    13         }
    14     }

     4、获取所有属性

     1         private void button1_Click(object sender, EventArgs e)
     2         {
     3             Type t = typeof(MyClass);
     4             PropertyInfo[] infos = t.GetProperties();
     5             for (int i = 0; i < infos.Length; i++)
     6             {
     7                 MessageBox.Show(infos[i].Name.ToString()); //获取字段属性的名称
     8                 MessageBox.Show(infos[i].GetMethod.ToString()); //获取此属性的get访问器
     9                 MessageBox.Show(infos[i].CanRead.ToString()); //获取一个值,该值属性是否只读
    10                 MessageBox.Show(infos[i].CanWrite.ToString()); //获取一个值,该值属性是否只写
    11                 MessageBox.Show(infos[i].PropertyType.ToString()); //获取此属性的数据类型
    12             }
    13         }
     1     public class MyClass
     2     {
     3         public string[] arrStr;
     4         public int Age { get; set; }
     5         public string Name { get; set; }
     6         public void Say()
     7         {
     8             MessageBox.Show("Hi");
     9         }
    10         private void SayHell()
    11         {
    12             MessageBox.Show("Hello");
    13         }
    14     }

    5、获取程序集中的所有类型 

     1         private void button1_Click(object sender, EventArgs e)
     2         {
     3             //根据程序的路径,动态加载程序集
     4             Assembly asm = Assembly.LoadFile(@"G:fansheWindowsFormsApplication1PersoninDebugPerson.dll");
     5             Type[] types = asm.GetTypes();
     6             for (int i = 0; i < types.Length; i++)
     7             {
     8                 MessageBox.Show(types[i].FullName);
     9             }
    10         }

    6、获取所有的public类型

     1         private void button1_Click(object sender, EventArgs e)
     2         {
     3             //根据程序的路径,动态加载程序集
     4             Assembly asm = Assembly.LoadFile(@"G:fansheWindowsFormsApplication1PersoninDebugPerson.dll");
     5             Type[] types = asm.GetExportedTypes();
     6             for (int i = 0; i < types.Length; i++)
     7             {
     8                 MessageBox.Show(types[i].FullName);
     9             }
    10         }

    7、获取指定的Person类,并调用该类中的SayHi方法

     1         private void button1_Click(object sender, EventArgs e)
     2         {
     3             //根据程序的路径,动态加载程序集
     4             Assembly asm = Assembly.LoadFile(@"G:fansheWindowsFormsApplication1PersoninDebugPerson.dll");
     5             Type typePerson = asm.GetType("Person.Person"); //命名空间.类名
     6             //获取该类中的SayHi方法
     7             MethodInfo method = typePerson.GetMethod("SayHi");
     8             //创建一个Person类型的对象
     9             //根据制定的Type,创建一个该类型的对象
    10             object obj = Activator.CreateInstance(typePerson);
    11             //调用该方法
    12             method.Invoke(obj,null); //第一个参数:类的实例化对象;第二个参数:方法的参数列表
    13         }

    Person类:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 using System.Windows.Forms;
     7 
     8 namespace Person
     9 {
    10     public class Person
    11     {
    12         public string Name { get; set; }
    13         public int Age { get; set; }
    14         public string Email { get; set; }
    15         public void SayHi()
    16         {
    17             MessageBox.Show("Hi");
    18         }
    19         public void SayHello(string name)
    20         {
    21             MessageBox.Show("Hello" + name);
    22         }
    23         public int Add(int n1,int n2)
    24         {
    25             return n1 + n2;
    26         }
    27     }
    28     public interface IFlyable
    29     {
    30         void Fly();
    31     }
    32     internal class Teacher : Person
    33     {
    34 
    35     }
    36     public class MyClass : IFlyable
    37     {
    38         public void Fly()
    39         {
    40             throw new NotImplementedException();
    41         }
    42     }
    43     struct MyStruct1
    44     {
    45 
    46     }
    47     public class Student : Person
    48     {
    49 
    50     }
    51     public delegate void MyDelegate();
    52     public enum MyEnum
    53     {
    54 
    55     }
    56 }

    效果

    8、获取指定的Person类,并调用该类中无参数SayHi方法重载

     1         private void button1_Click(object sender, EventArgs e)
     2         {
     3             //根据程序的路径,动态加载程序集
     4             Assembly asm = Assembly.LoadFile(@"G:fansheWindowsFormsApplication1PersoninDebugPerson.dll");
     5             Type typePerson = asm.GetType("Person.Person"); //命名空间.类名
     6             //获取该类中的SayHi方法
     7             MethodInfo method = typePerson.GetMethod("SayHi",new Type[] { });
     8             //创建一个Person类型的对象
     9             //根据制定的Type,创建一个该类型的对象
    10             object obj = Activator.CreateInstance(typePerson);
    11             //调用该方法
    12             method.Invoke(obj,null);
    13         }

    9、获取指定的Person类,并调用该类中有参数SayHi方法重载

     1         private void button1_Click(object sender, EventArgs e)
     2         {
     3             //根据程序的路径,动态加载程序集
     4             Assembly asm = Assembly.LoadFile(@"G:fansheWindowsFormsApplication1PersoninDebugPerson.dll");
     5             Type typePerson = asm.GetType("Person.Person"); //命名空间.类名
     6             //获取该类中的SayHi方法
     7             MethodInfo method = typePerson.GetMethod("SayHi",new Type[] {typeof(string) });
     8             //创建一个Person类型的对象
     9             //根据制定的Type,创建一个该类型的对象
    10             object obj = Activator.CreateInstance(typePerson);
    11             //调用该方法
    12             method.Invoke(obj,new object[]{ "Alex"});
    13         }

    10、如果调用方法有返回值,直接接受Invoke方法的返回值即可

     1         private void button1_Click(object sender, EventArgs e)
     2         {
     3             //根据程序的路径,动态加载程序集
     4             Assembly asm = Assembly.LoadFile(@"G:fansheWindowsFormsApplication1PersoninDebugPerson.dll");
     5             Type typePerson = asm.GetType("Person.Person"); //命名空间.类名
     6             //获取该类中的SayHi方法
     7             MethodInfo method = typePerson.GetMethod("SayHi",new Type[] {typeof(string) });
     8             //创建一个Person类型的对象
     9             //根据制定的Type,创建一个该类型的对象
    10             object obj = Activator.CreateInstance(typePerson);
    11             //调用该方法
    12             object result = method.Invoke(obj,new object[]{ "Alex"});
    13         }

    11、通过调用指定的构造函数来创建对象,并获取指定对象的属性的值

     1         private void button1_Click(object sender, EventArgs e)
     2         {
     3             //根据程序的路径,动态加载程序集
     4             Assembly asm = Assembly.LoadFile(@"G:fansheWindowsFormsApplication1PersoninDebugPerson.dll");
     5             Type typePerson = asm.GetType("Person.Person"); //命名空间.类名
     6             //通过调用指定的构造函数来创建对象
     7             ConstructorInfo info = typePerson.GetConstructor(new Type[] { typeof(string),typeof(int),typeof(string)});
     8             //调用构造函数,来创建对象
     9             object obj = info.Invoke(new object[] {"alex",15,"alex@163.com"});
    10             //通过反射获取指定对象的属性的值
    11             PropertyInfo pInfo = typePerson.GetProperty("Name"); //属性名
    12             string name = pInfo.GetValue(obj, null).ToString(); //获取值,第一个参数:构造函数的实例化对象;第二个参数:索引器
    13             MessageBox.Show(name);
    14         }

    Person类:

     1     public class Person
     2     {
     3         public Person()
     4         {
     5 
     6         }
     7         public Person(string name,int age,string email)
     8         {
     9             this.Name = name;
    10             this.Age = age;
    11             this.Email = email;
    12         }
    13         public string Name { get; set; }
    14         public int Age { get; set; }
    15         public string Email { get; set; }
    16         public void SayHi()
    17         {
    18             MessageBox.Show("Hi");
    19         }
    20         public void SayHello(string name)
    21         {
    22             MessageBox.Show("Hello" + name);
    23         }
    24         public int Add(int n1,int n2)
    25         {
    26             return n1 + n2;
    27         }
    28     }

    效果:

  • 相关阅读:
    请求分页中的内存分配
    Android开发实例总结
    出现java.lang.IllegalArgumentException异常
    请求分页中的内存分配之续
    HTTPCLIENT使用学习
    传输控制层协议TCP概述抄书
    freemarker中空值 null的处理 ?exists ?if_exists ?default(“”)
    Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring 大新博客 推酷 360安全浏览器 7.1
    jade 学习笔记 gulp 自动编译
    @resource和@autowired的区别是什么CSDN论坛CSDN.NET中国最大的IT技术社区 Google Chrome
  • 原文地址:https://www.cnblogs.com/chenyanbin/p/11001028.html
Copyright © 2011-2022 走看看