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