欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-11-27 12:33:40
本文实例讲述了c#定义简单的反射工厂用法。分享给大家供大家参考。具体分析如下: 首先,定义一个水果抽象类,代码如下: class fruit { //定...

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