C#反射之基础应用实例总结
本文将反射的东西整理了一下,提供了最全面的东西,当然也是基础的东西,
在学好了这一切的基础上,大家可以学习反射的具体插件等应用首先我们建立一个类库,将它生成为reflectPrj.dll,
usingSystem; usingSystem.Collections.Generic; usingSystem.Text; namespacereflectPrj { ///<summary> ///接口 ///</summary> publicinterfaceInterface1 { intAdd(intnum); intAdd(); } ///<summary> ///用来被测试的类 ///</summary> publicclassReflectTest:Interface1 { publicstringwritea; publicstringWriteA { get{returnwritea;} set{writea=value;} } publicstringWriteb; publicstringWriteB { get{returnWriteb;} set{Writeb=value;} } publicReflectTest() { this.WriteA="WriteA"; this.WriteB="WriteB"; } publicReflectTest(stringa,stringb) { this.WriteA=a; this.WriteB=b; } publicintAdd() { return100; } publicintAdd(intnum) { returnnum; } publicstringWriteString(stringa,stringb) { return"欢迎你,"+a+"------"+b; } publicstaticstringWriteName(strings) { return"欢迎光临,"+s; } publicstringWriteNoPara() { return"你使用的是无参数方法!"; } privatestringWritePrivate() { return"私有类型的方法!"; } } }
之后再建立一个项目引入该reflectPrj.dll
usingSystem; usingSystem.Collections.Generic; usingSystem.Text; usingreflectPrj; usingSystem.Threading; usingSystem.Reflection; namespacereflectPrjTest { classMyReflectTest { //建立委托 delegatestringTestDelegate(stringa,stringb); staticvoidMain(string[]args) { Assemblyassembly=Assembly.Load("reflectPrj"); foreach(Typevarinassembly.GetTypes()) { Console.WriteLine(var.Name);//显示dll下所有的类 } //******************************************************* Module[]modules=assembly.GetModules(); foreach(Modulemoduleinmodules) { Console.WriteLine("module(模块/组件)名:"+module.Name); } //******************************************************* //得到具体的类的类型 Typea=typeof(reflectPrj.ReflectTest); Console.WriteLine(a.Name); //******************************************************* //A------创建类型的实例---->此处是由带参的构造函数的来得到的实例 string[]paras={"aaa","bbb"}; //创建该类的实例,后面的paras为有参构造函数的参数---->此obj即是类型a的一个实例 //此实例调用的是一个带参的构造函数 objectobj=Activator.CreateInstance(a,paras); //得到对象的属性 Console.WriteLine("得到对象a的属性:"); foreach(objectvarina.GetProperties()) { Console.WriteLine(var.ToString()); } MethodInfo[]miArr=a.GetMethods(); Console.WriteLine("显示所有的共有方法:"); //显示所有的共有方法 foreach(MethodInfomethodinmiArr) { Console.WriteLine(method.Name); } //************************************************************ //显示具体的方法 Console.WriteLine("显示具体的方法!"); //1.带参的方法的使用 MethodInfomi=a.GetMethod("WriteString"); stringmiReturn=(string)mi.Invoke(obj,newobject[]{"使用的是带参数的非静态方法","2"}); Console.WriteLine("---"+mi.Name+"返回值:"+miReturn); //2.不带参数的方法调用 Console.WriteLine("不带参数的方法的调用:"); MethodInfomiNopara=a.GetMethod("WriteNoPara"); stringmiNoparaReturn=(string)miNopara.Invoke(obj,null); Console.WriteLine("---"+miNoparaReturn); //3.私有类型方法的使用 Console.WriteLine("私有类型方法的使用:"); MethodInfomiPrivate=a.GetMethod("WritePrivate",BindingFlags.Instance|BindingFlags.NonPublic); stringmiPrivateReturn=(string)miPrivate.Invoke(obj,null); Console.WriteLine("---"+miPrivateReturn); Console.WriteLine("***********************属性的使用**********************"); //4.得到对象的属性 PropertyInfo[]propertys=a.GetProperties(BindingFlags.Instance|BindingFlags.NonPublic|BindingFlags.Public); //5.显示所有属性名 Console.WriteLine("对象的所有属性名如下:"); foreach(PropertyInfoproinpropertys) { //Console.WriteLine(pro.Name); //获取属性最初的值 Console.WriteLine(pro.Name+":"+pro.GetValue(obj,null)); //给属性重新赋值 pro.SetValue(obj,"张三丰",null); Console.WriteLine(pro.Name+":"+pro.GetValue(obj,null)); } //6.获取指定的属性,并赋值 PropertyInfopropertyInfo=a.GetProperty("WriteA",BindingFlags.Instance|BindingFlags.NonPublic|BindingFlags.Public); propertyInfo.SetValue(obj,"郁金香",null); Console.WriteLine(propertyInfo.Name+":"+propertyInfo.GetValue(obj,null)); Console.WriteLine("*********************FieldInfo---公开字段的使用***********************"); //7.字段的使用---->只能获取公开字段 FieldInfof1=a.GetField("writea",BindingFlags.Instance|BindingFlags.NonPublic|BindingFlags.Public); Console.WriteLine(f1.GetValue(obj)); try { reflectPrj.ReflectTesttest=newReflectTest("Marry","Jack"); TypemyReflect=typeof(ReflectTest); FieldInfofield1=myReflect.GetField("writea",BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Instance); Console.WriteLine(field1.GetValue(test)); } catch(Exceptionex) { Console.WriteLine(ex.Message); } //******************************************************* //8.构造函数的使用 Console.WriteLine("获得构造函数的形式"); ConstructorInfo[]cis=a.GetConstructors(); foreach(ConstructorInfociincis) { Console.WriteLine("构造函数的形式:"+ci.ToString());//获得构造函数的形式 Console.WriteLine("构造函数名称:"+ci.Name); } //打印带参构造函数的形式 ConstructorInfoascSingle=a.GetConstructor(newType[]{typeof(string),typeof(string)}); Console.WriteLine(ascSingle.ToString()); //**************************************************** //9.工厂模式 Console.WriteLine(a.Name); reflectPrj.Interface1reflectObj2=(Interface1)assembly.CreateInstance("reflectPrj.ReflectTest"); reflectPrj.ReflectTestreflectObj1=(ReflectTest)assembly.CreateInstance("reflectPrj.ReflectTest"); Console.WriteLine(reflectObj2.Add());//典型的工厂模式,在后续真正应用中使用的是接口中的方法(而接口又由实现接口的类来实现) Console.WriteLine(reflectObj1.WriteNoPara()); //10工厂模式---方法的重载 intnum=300; Console.WriteLine(reflectObj1.Add(300)); Console.WriteLine("工厂模式的再一次实现!"); foreach(Typetypeinassembly.GetTypes()) { if(type.GetInterface("reflectPrj.Interface1")!=null) { //由接口的实现类来实现该接口 reflectPrj.Interface1interfaceObj3=(Interface1)Activator.CreateInstance(a); Console.WriteLine(interfaceObj3.Add()); Console.WriteLine(interfaceObj3.Add(600)); } } //**************************************************** //11.动态创建委托的简单例子--->将委托绑定到目标方法上 TestDelegatemyMothod=(TestDelegate)Delegate.CreateDelegate(typeof(TestDelegate),obj,mi); Console.WriteLine(myMothod.Invoke("Tom","Jack")); //**************************************************** //B----------.无参构造函数的使用 Console.WriteLine("无参构造函数的使用!"); //objNonePara是由ReflectTest类的构造函数所产生的对象 objectobjNonePara=Activator.CreateInstance(a); stringinfo=((reflectPrj.ReflectTest)objNonePara).WriteNoPara(); Console.WriteLine(info); PropertyInfoproWriteA=a.GetProperty(((ReflectTest)objNonePara).WriteA); Console.WriteLine(proWriteA.GetValue(objNonePara,null)); proWriteA.SetValue(objNonePara,"小小郁金香",null); Console.WriteLine(proWriteA.GetValue(objNonePara,null)); //C:---------再次用带参的构造函数来产生实例 ReflectTestobjPara=(ReflectTest)Activator.CreateInstance(a,newobject[]{"小郁","来吧"}); Console.WriteLine(objPara.WriteA+"/t"+objPara.WriteB); Console.WriteLine(objPara.WriteNoPara()); //调用带参的方法 Console.WriteLine(objPara.WriteString("大郁","回家吧!")); MethodInfomyMi=a.GetMethod("WriteString"); //利用委托动态的将将委托绑定的指定的方法 myMothod=(TestDelegate)Delegate.CreateDelegate(typeof(TestDelegate),objPara,myMi); Console.WriteLine(myMothod.Invoke("过年啦","牛年快乐啊!")); //屏幕暂停 Console.ReadLine(); } } }
希望本文所述对大家的C#程序设计有所帮助。