软件编程
位置:首页>> 软件编程>> C#编程>> C#定义简单的反射工厂实例分析

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

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

标签: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#程序设计有所帮助。

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com