本文实例讲述了C#定义简单的反射工厂用法。分享给大家供大家参考。具体分析如下:
首先,定义一个水果抽象类,代码如下:
class Fruit { //定义虚方法 public virtual void Eating() { Console.WriteLine("水果有各种吃法。。。"); } }
然后,实例化几个水果类,代码如下:
class Banana : Fruit { public override void Eating() { Console.WriteLine("香蕉扒皮吃。。。"); } } class Orange : Fruit { public override void Eating() { Console.WriteLine("橘子剥皮吃。。。"); } } class Apple : Fruit { public new void Eating() { Console.WriteLine("苹果洗了吃。。。"); } //public override void Eating() //{ // Console.WriteLine("苹果洗了吃。。。"); //} }
最后,创建水果工厂,代码如下:
//水果工厂 class FruitFactory { //生成水果 public Fruit CreateFruit(string _fruitname) { //不使用反射的做法如下: //if ("Apple" == _fruitname) //{ // return new Apple(); //} //else if ("Banana" == _fruitname) //{ // return new Banana(); //} //else if ("Orange" == _fruitname) //{ // return new Orange(); //} //else //{ // throw new Exception("您指定的水果不生产!"); //} //获得当前程序的命名空间 string strNamespace = Assembly.GetExecutingAssembly().GetName().Name; //调用方法一:使用 Type 类 //Type type = Type.GetType("ConsoleApplication1." + _fruitname); //ConstructorInfo ctorInfo = type.GetConstructor(System.Type.EmptyTypes); //// Invoke()方法:返回与构造函数关联的类的实例。 //Fruit fruitA = (Fruit)ctorInfo.Invoke(new object[0]); //return fruitA; //调用方法二:使用 Assembly 类 //Assembly myAssembly = Assembly.GetExecutingAssembly(); //Fruit fruitB = (Fruit)myAssembly.CreateInstance("ConsoleApplication1." + _fruitname); //return fruitB; //调用方法三:使用 Activator 类 Fruit fruitC = (Fruit)Activator.CreateInstance(Type.GetType("ConsoleApplication1." + _fruitname, false, true)); return fruitC; } }
测试代码如下:
class Program { static void Main(string[] args) { FruitFactory ff = new FruitFactory(); //打印(来自父类的):水果有各种吃法。。。 Fruit fA = ff.CreateFruit("Apple"); fA.Eating(); //打印(来自子类的):苹果洗了吃。。。 Apple apple = ff.CreateFruit("Apple") as Apple; apple.Eating(); Fruit fB = ff.CreateFruit("Banana"); fB.Eating(); Fruit fC = ff.CreateFruit("Orange"); fC.Eating(); } }
利用反射创建实例对象的常用三种方式:
// 方式一:使用 Type 类 Type type = Type.GetType("ConsoleApplication1." + _fruitname); ConstructorInfo ctorInfo = type.GetConstructor(System.Type.EmptyTypes); // Invoke()方法:返回与构造函数关联的类的实例。 Fruit fruitA = (Fruit)ctorInfo.Invoke(new object[0]); return fruitA; // 方式二:使用 Assembly 类 Assembly myAssembly = Assembly.GetExecutingAssembly(); Fruit fruitB = (Fruit)myAssembly.CreateInstance("ConsoleApplication1." + _fruitname); return fruitB; // 方式三:使用 Activator 类 Fruit fruitC = (Fruit)Activator.CreateInstance(Type.GetType("ConsoleApplication1." + _fruitname, false, true)); return fruitC; 示例的全部代码如下: using System; using System.Collections.Generic; using System.Text; using System.Reflection; //抽象类可以继承抽象类 namespace ConsoleApplication1 { class Fruit { //定义虚方法 public virtual void Eating() { Console.WriteLine("水果有各种吃法。。。"); } } //水果工厂 class FruitFactory { //生成水果 public Fruit CreateFruit(string _fruitname) { //不使用反射的做法如下: //if ("Apple" == _fruitname) //{ // return new Apple(); //} //else if ("Banana" == _fruitname) //{ // return new Banana(); //} //else if ("Orange" == _fruitname) //{ // return new Orange(); //} //else //{ // throw new Exception("您指定的水果不生产!"); //} //获得当前程序的命名空间 string strNamespace = Assembly.GetExecutingAssembly().GetName().Name; //调用方法一:使用 Type 类 //Type type = Type.GetType("ConsoleApplication1." + _fruitname); //ConstructorInfo ctorInfo = type.GetConstructor(System.Type.EmptyTypes); //// Invoke()方法:返回与构造函数关联的类的实例。 //Fruit fruitA = (Fruit)ctorInfo.Invoke(new object[0]); //return fruitA; //调用方法二:使用 Assembly 类 //Assembly myAssembly = Assembly.GetExecutingAssembly(); //Fruit fruitB = (Fruit)myAssembly.CreateInstance("ConsoleApplication1." + _fruitname); //return fruitB; //调用方法三:使用 Activator 类 Fruit fruitC = (Fruit)Activator.CreateInstance(Type.GetType("ConsoleApplication1." + _fruitname, false, true)); return fruitC; } } class Banana : Fruit { public override void Eating() { Console.WriteLine("香蕉扒皮吃。。。"); } } class Orange : Fruit { public override void Eating() { Console.WriteLine("橘子剥皮吃。。。"); } } class Apple : Fruit { public new void Eating() { Console.WriteLine("苹果洗了吃。。。"); } //public override void Eating() //{ // Console.WriteLine("苹果洗了吃。。。"); //} } class Program { static void Main(string[] args) { FruitFactory ff = new FruitFactory(); //打印(来自父类的):水果有各种吃法。。。 Fruit fA = ff.CreateFruit("Apple"); fA.Eating(); //打印(来自子类的):苹果洗了吃。。。 Apple apple = ff.CreateFruit("Apple") as Apple; apple.Eating(); Fruit fB = ff.CreateFruit("Banana"); fB.Eating(); Fruit fC = ff.CreateFruit("Orange"); fC.Eating(); } } }
希望本文所述对大家的C#程序设计有所帮助。
本文向大家介绍PHP设计模式之简单工厂和工厂模式实例分析,包括了PHP设计模式之简单工厂和工厂模式实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP设计模式之简单工厂和工厂模式。分享给大家供大家参考,具体如下: 工厂模式是创建型模式的一种,分为简单工厂模式,工厂模式,抽象工厂模式,简单工厂可以称之为工厂模式的一个特例 先用一段简单的代码说明一下,现在假设我们是顾客,需要苹果味饮
//抽象类 enum SpliterType { BinaryType = 0, TxtYype = 1 }; class ISplitter { public: virtual void split() = 0; virtual ~ISplitter() {} }; //具体类 class BinarySplitter : public ISplitter { public: voi
本文向大家介绍C++设计模式之简单工厂模式实例,包括了C++设计模式之简单工厂模式实例的使用技巧和注意事项,需要的朋友参考一下 问题描述 之前在公司做了一个windows 8平台的阅读器。首先,需要将电子书中的内容渲染到屏幕上,而电子书每一页都包含各种各样的内容,比如:图形、图像和文字等等;不同的内容,就是不同的对象;在将不同的内容渲染到屏幕上之前,就需要new操作,建立不同的对象,然后再在屏幕上
本文向大家介绍Java工厂模式定义与用法实例分析,包括了Java工厂模式定义与用法实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java工厂模式定义与用法。分享给大家供大家参考,具体如下: 一 代码 二 运行 我是一个I形的方块! 我是一个L形的方块! 三 类图 更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教
本文向大家介绍js简单工厂模式用法实例,包括了js简单工厂模式用法实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了js简单工厂模式用法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的javascript程序设计有所帮助。
本文向大家介绍C#反射应用实例,包括了C#反射应用实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#反射应用。分享给大家供大家参考。具体如下: 通过反射实现多系统数据库的配置 通过定义接口,反射实例化配置的节点的值 配置App.config: 通过System.Configuration.ConfigurationManager.AppSettings读取该key的value,使用C