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


猜你喜欢
- 一、获取某年某月的天数1.在实现日期类的过程中,日期加减天数的应用场景一定会频繁使用到这个函数接口,因为加减天数会使得月份发生变化,可能增月
- 目前市面上的第三方短信服务平台数量十分庞大,并能为企业提供三网合一的短信接口,这些服务商通过整合短信发送服务,简单的打包成为API和SDK接
- 本文实例为大家分享了C#仿微信红包功能的具体代码,供大家参考,具体内容如下Program.cs代码:class Program { &nbs
- spring Boot 熟悉后,集成一个外部扩展是一件很容易的事,集成Redis也很简单,看下面步骤配置:一、添加pom依赖
- 前言Java克隆(Clone)是Java语言的特性之一,但在实际中应用比较少见。但有时候用克隆会更方便更有效率。对于克隆(Clone),Ja
- 一、前言跟很多小伙伴聊天,发现一个严重的问题,很多小伙伴横向发展的貌似很不错,很多技术都能说出一二,但是如果在某个技术上深挖一下就不行了,问
- 简介简单的文本编译器,可以通过弹出对话框打开文件,进行编写并保存文件。代码package Code.a;import java.io.*;i
- 业务场景通常微服务对于用户认证信息解析有两种方案在 gateway 就解析用户的 token 然后路由的时候把 userId 等相关信息添加
- 简介TCP简介TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层
- 最近在开发中遇到一个关于Java方法重写的一些问题,对于方法重写的用法以及可能导致的问题产生了一些思考,本文用于记录下这些想法。问题场景我们
- 如果我们只是需要让用户能够拍摄照片,则可以直接请求已有相机应用拍摄照片并将照片返回给我们1、拍照1.1 请求相机功能在清单文件中添加: &n
- 在上一篇文章中完成了 《Maven镜像地址大全 》,后来又花了时间又去收集并整理了关于 maven 远程仓库地址,并整理于此,关于 Mave
- java简易小游戏制作游戏思路:设置人物移动,游戏规则,积分系统,随机移动的怪物,游戏胜负判定,定时器。游戏内容部分package 代码部分
- 前言前面文章讲了消息是如何保存的以及consumeQueue与Index文件更新机制。随着消息的增加,Broker不可能一直保存所有消息,B
- 一.认识IO1.IO的分类(1)BIO:同步阻塞IO(2)NIO:同步非阻塞IO(3)AIO:异步阻塞IO注意: 这里主要介绍BIO2.IO
- 在客户机和服务器之间建立单一的双向连接,这就意味着客户只需要发送一个请求到服务端,那么服务端则会进行处理,处理好后则将其返回给客户端,客户端
- 有时候如果想让我们的应用在桌面上创建多个快捷方式,我们可以在Manifest.xml文件中对相应的activity进行声明。<appl
- 基类:using System;using System.Collections.Generic;using System.Linq;usi
- logback输出日志屏蔽quartz的debug等级日志在一个spring的老项目中,使用了logback来作为日志管理,logback.
- 表格是最常用的数据统计形式之一,在 swing 中 由