当前位置: 移动技术网 > IT编程>开发语言>c# > C#定义简单的反射工厂实例分析

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

2019年07月18日  | 移动技术网IT编程  | 我要评论
本文实例讲述了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#程序设计有所帮助。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网