.Net一个反射的范例,深刻理解反射
.Net一个反射的实例,深刻理解反射
反射的定义:审查元数据并收集关于它的类型信息的能力,简单理解反射就是把元数据里的类库反射出一个实例用于调用类库成员。
元数据简单理解就是.dll文件里的数据。
反射的应用:
1.在.net实现工厂模式的时候好多都会用到反射。而工厂模式用的很多。
2. 使用反射动态绑定需要牺牲性能
3. 有些元数据信息是不能通过反射获取的
4. 某些反射类型是专门为那些clr 开发编译器的开发使用的,所以你要意识到不是所有的反射类型都是适合每个人的。
下面举一个实例帮助大家理解:
接口 namespace Calculator { public interface Iwel { String Print(); } } 类 namespace Calculator { public class Arithmetic:Iwel { /// <summary> /// 没有带参数的构造函数 /// </summary> public Arithmetic() {} public Arithmetic(int num1, int num2) { _num1 = num1; _num2 = num2; } private int _num1; public int Num1 { get { return _num1; } set { _num1 = value; } } private int _num2; public int Num2 { get { return _num2; } set { _num2 = value; } } public String Add(int num1, int num2) { Console.WriteLine("{0}+{1}={2}", num1, num2, num1 + num2); return "Add(int num1,int num2)方法是一个公有的带参数的方法"; } private string Add() { return "Add()方法是一个私有的不传参数的方法"; } private void Subtration(int num1, int num2) { Console.WriteLine("{0}-{1}={2}+Subtration(int num1,int num2)" + "方法是一个私有的带有参数的方法 ",num1,num2,num1-num2); } public static void Multiplication(int num1, int num2) { Console.WriteLine("{0}*{1}={2} Multiplication(int num1,int num2)"+"是一个公有的带参数的静态方法",num1,num2,num1+num2); } private static void Multiplication() { Console.WriteLine("Multiplication()是一个公有的带参数的静态方法"); } public String Writ() { return "Writ() 是一个公有的不带参数的方法"; } #region Iwel 成员 public string Print() { return "欢迎您使用接口!"; } #endregion } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; namespace BassLib { class Program { delegate void TestDelegate(int num1, int num2); static void Main(string[] args) { Assembly assembly = Assembly.Load("Calculator");//加载程序集 Console.WriteLine("得到Calculator.dll中的所有类"); Console.WriteLine("***********************************"); foreach (Type myType in assembly.GetTypes()) { //得到Calculator.dll中所有的类 Console.WriteLine(myType.Name + "是Calculator命中空间下的类"); } Console.WriteLine(" +++++++++++++++++++++++++++++++++++++"); Console.WriteLine("得到Calculator.dll中的模块集"); Module[] modules = assembly.GetModules();//得到Calculator.dll中的模块集合 foreach (Module module in modules) { Console.WriteLine(module.Name + "是Calculator中的一个模块 "); } Console.WriteLine("*********************************************"); Console.WriteLine(""); Type type = typeof(Calculator.Arithmetic);//得到具体的类型 Console.WriteLine("具体的类型是" + type.Name); Console.WriteLine(" {0}是不是public类型:{1}", type, type.IsPublic); Console.WriteLine("{0}是不是private类型:{1}", type, type.IsNotPublic); Console.WriteLine("*********************************************"); Console.WriteLine(""); PropertyInfo[] memberInfo = type.GetProperties();//得到类中的属性 foreach (PropertyInfo var in memberInfo) { Console.WriteLine(type + "类的属性有" + var.Name); } Console.WriteLine("**********************************************"); Console.WriteLine(""); Type[] t = type.GetInterfaces();//得到接口 foreach (Type var in t) { Console.WriteLine(var.Name + "是Calculator.dll中的接口"); } Console.WriteLine("*****************************************"); Console.WriteLine(""); Console.WriteLine("方法的返回类型,方法传参的类型"); //查找私有的方法 MethodInfo[] method = type.GetMethods(BindingFlags.Instance | BindingFlags.NonPublic); foreach (MemberInfo var in method) { Console.WriteLine("私有方法: 方法名 ={0} 方法的信息={1}", var.Name, var); } //查找公有方法 MethodInfo[] methodpublic = type.GetMethods(BindingFlags.Instance | BindingFlags.Public); foreach (MethodInfo var in methodpublic) { Console.WriteLine("公有方法:方法名={0} 方法的信息={1}", var.Name, var); } //查找公有的静态方法 MethodInfo[] mathodstatic = type.GetMethods(BindingFlags.Public | BindingFlags.Static); foreach (MethodInfo var in mathodstatic) { Console.WriteLine("公有静态方法: 方法名={0} 方法的信息 ={1}", var.Name, var); } //查找私有静态方法 MethodInfo[] methodprivartstatic = type.GetMethods(BindingFlags.NonPublic | BindingFlags.Static); foreach (MethodInfo var in methodprivartstatic) { Console.WriteLine("私有静态方法: 方法名={0} 方法的信息={1}", var.Name, var); } Console.WriteLine("+++++++++++++++++++++++++++++++++++++++++++++++"); Console.WriteLine("这是一个构造方法的形式 "); ConstructorInfo[] con = type.GetConstructors();//获得构造函数的形式 foreach (ConstructorInfo var in con) { Console.WriteLine(var); } Console.WriteLine("_________________________________"); object obj = Activator.CreateInstance(type, null);//创建了一个不带参数的实例 //公有非静态带参数和返回参数的方法的调用它 MethodInfo men1 = type.GetMethod("Add"); Console.WriteLine("调用{0}方法 ", men1); object[] nums1 = { 5, 4 };//参数 Console.WriteLine(men1.Invoke(obj, nums1)); Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"); //私有的非静态方法的调用 MethodInfo men2 = type.GetMethod("Add", BindingFlags.Instance | BindingFlags.NonPublic); Console.WriteLine(men2.Invoke(obj, null)); Console.WriteLine("**********************************"); //公有的静态带参数的方法的调用 MethodInfo men3 = type.GetMethod("Multiplication", BindingFlags.Public | BindingFlags.Static); object[] nums2 = { 5, 6 }; men3.Invoke(null, nums2); Console.WriteLine("*****************"); //私有的静态的 MethodInfo men4 = type.GetMethod("Multiplication", BindingFlags.NonPublic | BindingFlags.Static); men4.Invoke(null, null); Console.WriteLine("************************"); //动态创建一个委托 Console.WriteLine("动态创建委托"); TestDelegate dele = (TestDelegate)Delegate.CreateDelegate(typeof(TestDelegate), obj, "Subtration"); dele(9, 3); } } }