C#定义简单的反射工厂实例分析
作者:xugang
这篇文章主要介绍了C#定义简单的反射工厂的用法,实例分析了反射工厂的原理与使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
本文实例讲述了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#程序设计有所帮助。