Csharp/C#教程:C#定义简单的反射工厂实例分析分享

本文实例讲述了C#定义简单的反射工厂用法。分享给大家供大家参考。具体分析如下:

首先,定义一个水果抽象类,代码如下:

classFruit { //定义虚方法 publicvirtualvoidEating() { Console.WriteLine("水果有各种吃法。。。"); } }

然后,实例化几个水果类,代码如下:

classBanana:Fruit { publicoverridevoidEating() { Console.WriteLine("香蕉扒皮吃。。。"); } } classOrange:Fruit { publicoverridevoidEating() { Console.WriteLine("橘子剥皮吃。。。"); } } classApple:Fruit { publicnewvoidEating() { Console.WriteLine("苹果洗了吃。。。"); } //publicoverridevoidEating() //{ //Console.WriteLine("苹果洗了吃。。。"); //} }

最后,创建水果工厂,代码如下:

//水果工厂 classFruitFactory { //生成水果 publicFruitCreateFruit(string_fruitname) { //不使用反射的做法如下: //if("Apple"==_fruitname) //{ //returnnewApple(); //} //elseif("Banana"==_fruitname) //{ //returnnewBanana(); //} //elseif("Orange"==_fruitname) //{ //returnnewOrange(); //} //else //{ //thrownewException("您指定的水果不生产!"); //} //获得当前程序的命名空间 stringstrNamespace=Assembly.GetExecutingAssembly().GetName().Name; //调用方法一:使用Type类 //Typetype=Type.GetType("ConsoleApplication1."+_fruitname); //ConstructorInfoctorInfo=type.GetConstructor(System.Type.EmptyTypes); ////Invoke()方法:返回与构造函数关联的类的实例。 //FruitfruitA=(Fruit)ctorInfo.Invoke(newobject[0]); //returnfruitA; //调用方法二:使用Assembly类 //AssemblymyAssembly=Assembly.GetExecutingAssembly(); //FruitfruitB=(Fruit)myAssembly.CreateInstance("ConsoleApplication1."+_fruitname); //returnfruitB; //调用方法三:使用Activator类 FruitfruitC=(Fruit)Activator.CreateInstance(Type.GetType("ConsoleApplication1."+_fruitname,false,true)); returnfruitC; } }

测试代码如下:

classProgram { staticvoidMain(string[]args) { FruitFactoryff=newFruitFactory(); //打印(来自父类的):水果有各种吃法。。。 FruitfA=ff.CreateFruit("Apple"); fA.Eating(); //打印(来自子类的):苹果洗了吃。。。 Appleapple=ff.CreateFruit("Apple")asApple; apple.Eating(); FruitfB=ff.CreateFruit("Banana"); fB.Eating(); FruitfC=ff.CreateFruit("Orange"); fC.Eating(); } }

利用反射创建实例对象的常用三种方式:

//方式一:使用Type类 Typetype=Type.GetType("ConsoleApplication1."+_fruitname); ConstructorInfoctorInfo=type.GetConstructor(System.Type.EmptyTypes); //Invoke()方法:返回与构造函数关联的类的实例。 FruitfruitA=(Fruit)ctorInfo.Invoke(newobject[0]); returnfruitA; //方式二:使用Assembly类 AssemblymyAssembly=Assembly.GetExecutingAssembly(); FruitfruitB=(Fruit)myAssembly.CreateInstance("ConsoleApplication1."+_fruitname); returnfruitB; //方式三:使用Activator类 FruitfruitC=(Fruit)Activator.CreateInstance(Type.GetType("ConsoleApplication1."+_fruitname,false,true)); returnfruitC; 示例的全部代码如下: usingSystem; usingSystem.Collections.Generic; usingSystem.Text; usingSystem.Reflection; //抽象类可以继承抽象类 namespaceConsoleApplication1 { classFruit { //定义虚方法 publicvirtualvoidEating() { Console.WriteLine("水果有各种吃法。。。"); } } //水果工厂 classFruitFactory { //生成水果 publicFruitCreateFruit(string_fruitname) { //不使用反射的做法如下: //if("Apple"==_fruitname) //{ //returnnewApple(); //} //elseif("Banana"==_fruitname) //{ //returnnewBanana(); //} //elseif("Orange"==_fruitname) //{ //returnnewOrange(); //} //else //{ //thrownewException("您指定的水果不生产!"); //} //获得当前程序的命名空间 stringstrNamespace=Assembly.GetExecutingAssembly().GetName().Name; //调用方法一:使用Type类 //Typetype=Type.GetType("ConsoleApplication1."+_fruitname); //ConstructorInfoctorInfo=type.GetConstructor(System.Type.EmptyTypes); ////Invoke()方法:返回与构造函数关联的类的实例。 //FruitfruitA=(Fruit)ctorInfo.Invoke(newobject[0]); //returnfruitA; //调用方法二:使用Assembly类 //AssemblymyAssembly=Assembly.GetExecutingAssembly(); //FruitfruitB=(Fruit)myAssembly.CreateInstance("ConsoleApplication1."+_fruitname); //returnfruitB; //调用方法三:使用Activator类 FruitfruitC=(Fruit)Activator.CreateInstance(Type.GetType("ConsoleApplication1."+_fruitname,false,true)); returnfruitC; } } classBanana:Fruit { publicoverridevoidEating() { Console.WriteLine("香蕉扒皮吃。。。"); } } classOrange:Fruit { publicoverridevoidEating() { Console.WriteLine("橘子剥皮吃。。。"); } } classApple:Fruit { publicnewvoidEating() { Console.WriteLine("苹果洗了吃。。。"); } //publicoverridevoidEating() //{ //Console.WriteLine("苹果洗了吃。。。"); //} } classProgram { staticvoidMain(string[]args) { FruitFactoryff=newFruitFactory(); //打印(来自父类的):水果有各种吃法。。。 FruitfA=ff.CreateFruit("Apple"); fA.Eating(); //打印(来自子类的):苹果洗了吃。。。 Appleapple=ff.CreateFruit("Apple")asApple; apple.Eating(); FruitfB=ff.CreateFruit("Banana"); fB.Eating(); FruitfC=ff.CreateFruit("Orange"); fC.Eating(); } } }

希望本文所述对大家的C#程序设计有所帮助。

上述就是C#学习教程:C#定义简单的反射工厂实例分析分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)! 您可能感兴趣的文章:C#中使用反射遍历一个对象属性及值的小技巧通俗易懂的C#之反射教程C#中的程序集和反射介绍C#反射内存的处理分析C#反射应用实例C#反射之基础应用实例

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/906168.html

(0)
上一篇 2021年10月23日
下一篇 2021年10月23日

精彩推荐