首页 > 编程 > C# > 正文

C#定义简单的反射工厂实例分析

2020-01-24 02:02:57
字体:
来源:转载
供稿:网友

本文实例讲述了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#程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表