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

作者:xugang 时间:2021-08-21 15:16:16 

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

标签:C#,反射工厂
0
投稿

猜你喜欢

  • Android控件之TabHost用法实例分析

    2021-07-19 10:35:21
  • java中ConcurrentHashMap的读操作为什么不需要加锁

    2021-10-07 18:30:44
  • 基于C#实现的木马程序实例详解

    2023-02-25 20:05:03
  • 简单总结C++中指针常量与常量指针的区别

    2022-06-28 17:33:12
  • C#调用VB进行简繁转换的方法

    2023-02-25 23:19:43
  • C#学习笔记之状态模式详解

    2021-09-15 21:56:08
  • 使用IntelliJ IDEA搭建SSM框架的图文教程

    2022-06-14 00:56:19
  • java使用@Transactional时常犯的N种错误

    2021-08-16 01:58:44
  • Struts2 $,#,%详解及实例代码

    2021-09-10 04:18:40
  • java合并多个文件的实例代码

    2023-07-28 12:56:02
  • Java数据结构专题解析之栈和队列的实现

    2022-11-20 01:24:21
  • Android中调用另一个Activity并返回结果(选择头像功能为例)

    2022-09-08 23:43:10
  • Android操作Excel文件的功能实现

    2022-08-29 17:22:55
  • Java实现一个简单的定时器代码解析

    2021-11-24 20:25:38
  • win10和win7下java开发环境配置教程

    2022-05-01 05:34:22
  • Android组件之服务的详解

    2021-10-14 00:05:30
  • 详解flutter中常用的container layout实例

    2022-07-25 07:49:53
  • Android实现Window弹窗效果

    2022-12-07 21:48:16
  • 解决Properties属性文件中的值有等号和换行的小问题

    2023-09-07 19:22:58
  • Java8新特性之泛型的目标类型推断_动力节点Java学院整理

    2023-11-26 10:38:21
  • asp之家 软件编程 m.aspxhome.com