C#编写的程序会编译成一个程序集(.DLL或.exe),其中会包含元数据、编译代码和资源,经过反射能够获取到程序集中的信息
通俗来说,反射就是咱们在只知道一个对象的外部而不了解内部结构的状况下,能够知道这个对象的内部实现ide
首先在编译中分为动态编译和静态编译,静态编译是在编译中肯定类型,绑定对象,而动态编译是在运行中肯定类型,绑定对象
反射的优势就是能够动态建立对象、绑定对象,提升了程序的灵活性和扩展性,但反射是一种解释操做,在性能上不如静态编译快函数
——Type类是一个抽象类,所以不能用他去实例化对象
——object类中定义了一个GetType方法,所以全部类均可以使用GetType()获取到某一个对象所属类的Type对象
——经过Type对象能够获取到类中字段、属性、方法、构造函数等信息性能
using System; class MainClass { public static void Main(string[] args) { //1.经过对象获取到这个对象所属类的Type对象 TestClass c = new TestClass(); Type t = c.GetType(); //2.经过Type类中的静态方法GetType获取到类的Type对象 //Type t = Type.GetType("TestClass"); //3.经过typeof关键字获取到类的Type对象 //Type t = typeof(TestClass); Console.WriteLine(t.Name);//获取类名(不带命名空间) Console.WriteLine(t.FullName);//获取类名(带命名空间) Console.WriteLine(t.Assembly);//获取程序集 Console.WriteLine(t.BaseType);//获取基类类型 Console.WriteLine("----------获取类中字段"); var fields = t.GetFields(); foreach (var temp in fields) { Console.WriteLine(temp.Name); } Console.WriteLine("----------获取类中属性"); var properties = t.GetProperties(); foreach (var temp in properties) { Console.WriteLine(temp.Name); } Console.WriteLine("----------获取类中方法"); var methods = t.GetMethods(); foreach (var temp in methods) { Console.WriteLine(temp.Name); } Console.WriteLine("----------获取类中成员"); var members = t.GetMembers(); foreach (var temp in members) { Console.WriteLine(temp.Name); } Console.WriteLine("----------获取类中嵌套类"); var nesteds = t.GetNestedTypes(); foreach (var temp in nesteds) { Console.WriteLine(temp.Name); } Console.WriteLine("----------获取类中构造函数"); var constructors = t.GetConstructors(); foreach (var temp in constructors) { Console.WriteLine(temp.Name); } } } public class TestClass { public string str; public int num { get; set; } public void Fun() { } public class TestNestedClass { } }
获得一个Type类型对象有三种方法:object.GetType()、Type.GetType()、typeof()
使用object.GetType()必须先建立一个实例,然后两种不须要建立实例,但使用typeof运算符仍然须要知道类型的编译时信息,Type.GetType()静态方法不须要知道类型的编译时信息,因此是首选方法this
——经过Activator建立实例对象
using System; class MainClass { public static void Main(string[] args) { object c = Activator.CreateInstance(typeof(TestClass), "hello world"); Console.WriteLine(((TestClass)c).str); } } public class TestClass { public string str; public TestClass(string str) { this.str = str; } }
——经过构造函数建立实例资源
using System; class MainClass { public static void Main(string[] args) { Type t = typeof(TestClass); Type[] paramTypes = new Type[1] { typeof(string) }; var info = t.GetConstructor(paramTypes); object[] param = new object[1] { "hello world" }; var o = info.Invoke(param); Console.WriteLine(((TestClass)o).str); } } public class TestClass { public string str; public TestClass(string str) { this.str = str; } }
using System; using System.Reflection; class MainClass { public static void Main(string[] args) { TestClass cc = new TestClass(); Type t = cc.GetType(); FieldInfo info = t.GetField("str"); info.SetValue(cc, "hello world"); Console.WriteLine(info.GetValue(cc)); } } public class TestClass { public string str; }