大家好,欢迎来到IT知识分享网。
反射是很多框架都用到的东西,是从0.25到0.5的一个进阶
反射可以动态创建对象,动态赋值,动态调用方法
反射可以在运行时获得类的信息
每个类都有一个 type对象,构造方法对应的是 ConstructorInfo对象,方法对应的是 MethodInfo对象,字段对应的是 FieldInfo对象,属性对应的是 PropertyInfo对象,使用时需要引用using System.Reflection;
Type
class Dog:Animal { public string name; public int age; double price; static double weight; public Dog() { } public Dog(string name) { } public Dog(string name,int age) { } public override void Say() { } public double Price { get; set; } public double Weight { get; set; } } class Animal { public virtual void Say() { } } class Print { static void Main() { Dog dog = new Dog(); // 获取类的 type 对象常用的三种方式 Type type = typeof(Dog); Type type1 = dog.GetType(); Type type2 = Type.GetType("Application.Dog"); //假设只知道类的名字,利用类名创建对象实例 Type t = typeof(Dog); // Activator.CreateInstance(t); 被实例化的对象必须有无参构造方法,没有则会抛出 MissingMethodException 缺失方法异常 object dog1 = Activator.CreateInstance(t); // 相当于 new Dog();,由于返回的是 object ,所以只能用 object 接收 Console.WriteLine(dog1); Console.WriteLine(t.BaseType); // 获取父类 Console.WriteLine(t.Name); // 获取类名 Console.WriteLine(t.FullName); // 获取全名,包含命名空间 Console.WriteLine(t.IsAbstract); // 判断是否为 抽象类 Console.WriteLine(t.IsArray); // 是否为 数组 Console.WriteLine(t.IsClass); // 是否为 普通类 Console.WriteLine(t.IsEnum); // 是否为 枚举 Console.WriteLine(t.IsPublic); // 是否为 public Console.WriteLine(t.IsValueType); // 是否为 值类型 Console.WriteLine("------------* 构造方法 *---------------"); // 获取无参构造方法 t.GetConstructor(new Type[0]); 参数要求是 type对象数组,因此无参构造就只需要入参长度为 0 的数组就好了 ConstructorInfo c1 = t.GetConstructor(new Type[0]); Console.WriteLine(c1); // Void .ctor ctor是IL里面构造方法的表现方式 // 获取参数类型为 string 的构造方法 c1 = t.GetConstructor(new Type[] { typeof(string) }); Console.WriteLine(c1); // 获取参数类型为 string,int 的构造方法 c1 = t.GetConstructor(new Type[] { typeof(string), typeof(int) }); Console.WriteLine(c1); Console.WriteLine("------------* 字段 *---------------"); // 获取所有字段,必须是public,获取的是未封装的字段 FieldInfo[] f1 = t.GetFields(); foreach (var field in f1) { Console.WriteLine(field); } // 获取 非public,且 非static 的字段,如果需要获取 static的,把Instance改成static f1 = t.GetFields(BindingFlags.NonPublic | BindingFlags.Instance); foreach (var field in f1) { Console.WriteLine(field); } Console.WriteLine("------------* 方法 *---------------"); // 获得所有方法 MethodInfo[] m1 = t.GetMethods(); foreach (var method in m1) { Console.WriteLine(method); } // 获得指定方法 // 注:如果方法有重载,则抛出 AmbiguousMatchException MethodInfo m2 = t.GetMethod("Say"); Console.WriteLine("\n"+m2); // 解决方法抛出 AmbiguousMatchException异常 m2 = t.GetMethod("Say",new Type[0]); // 获取无参方法 m2 = t.GetMethod("Say",new Type[] { typeof(string)}); // 获取参数为 string 的方法 Console.WriteLine("------------* 属性 *---------------"); // 获得属性,获取到的是封装过的属性 PropertyInfo[] prop = t.GetProperties(); foreach (var p in prop) { Console.WriteLine(p); } } }
输出:
Application.Dog Application.Animal Dog Application.Dog False False True False False False ------------* 构造方法*--------------- Void.ctor() Void .ctor(System.String) Void .ctor(System.String, Int32) ------------* 字段*--------------- System.String name System.Int32 age System.Double price System.Double<Price> k__BackingField System.Double<Weight> k__BackingField ------------* 方法*--------------- Void Say() Double get_Price() Void set_Price(Double) Double get_Weight() Void set_Weight(Double) Boolean Equals(System.Object) Int32 GetHashCode() System.Type GetType() System.String ToString() Void Say() ------------* 属性*--------------- Double Price Double Weight
反射示例 1
class Dog { public string name; public void Say() { Console.WriteLine("你好,"+Name); } public void Say(string name) { Console.WriteLine(#34;你好,{name}"); } public string Name { get; set; } } class Print { // 反射示例 static void Main() { // 创建对象 Type t = typeof(Dog); object obj = Activator.CreateInstance(t); // 创建对象,调用无参构造(方法1) object obj1 = t.GetConstructor(new Type[0]).Invoke(new object[0]); // 获得对象的无参构造,调用(方法2) // 给属性赋值 PropertyInfo prop = t.GetProperty("Name"); // 获得属性 prop.SetValue(obj, "大宝"); // 赋值 // 调用方法 MethodInfo method = t.GetMethod("Say", new Type[0]); // 获得无参方法 MethodInfo method1 = t.GetMethod("Say", new Type[] { typeof(string) }); // 获得有参方法 method.Invoke(obj, new object[0]); // 调用无参方法 method1.Invoke(obj, new object[] { "Tom" }); // 调用有参方法并赋值 } }
输出:
你好,大宝 你好,Tom
反射示例 2
class Dog { public string name; public void Say() { Console.WriteLine("你好,"+Name); } public void Say(string name) { Console.WriteLine(#34;你好,{name}"); } public string Name { get; set; } } class Print { static void Main() { Dog dog = new Dog(); dog.Name = "Tom"; Show(dog); } static void Show(object obj) { Type t = obj.GetType(); PropertyInfo[] prop = t.GetProperties(); foreach (var p in prop) { if (p.CanRead) { string name = p.Name; object value = p.GetValue(obj); Console.WriteLine(name+"="+value); } } } }
输出:
Name=Tom
反射示例3 (复制对象的值)(浅拷贝–仅复制对象的值,不是同一个对象)
class Dog { public string name; public string Name { get; set; } } class Print { static void Main() { Dog dog = new Dog(); dog.Name = "Tom"; object dog1 = Clone(dog); Console.WriteLine(object.ReferenceEquals(dog,dog1)); // 判断是否为同一个对象 } static object Clone(object obj) { Type t = obj.GetType(); object newObject = Activator.CreateInstance(t); // 创建对象 PropertyInfo[] prop = t.GetProperties(); foreach (var p in prop) { if (p.CanRead&&p.CanWrite) { object value = p.GetValue(obj); p.SetValue(newObject, value); } } return newObject; } }
输出:
False
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/88730.html