• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C#定义简单的反射工厂实例分析

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

作者:xugang 字体:[增加 减小] 来源:互联网 时间:2017-05-28

xugang 通过本文主要向大家介绍了c#类定义的实例化,c#定义一个数组,c#定义字符串数组,c#数组定义,c#自定义控件等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

本文实例讲述了C#定义简单的反射工厂用法。分享给大家供大家参考。具体分析如下:

首先,定义一个水果抽象类,代码如下:

class Fruit
{
  //定义虚方法
  public virtual void Eating()
  {
    Console.WriteLine("水果有各种吃法。。。");
  }
}
</div>

然后,实例化几个水果类,代码如下:

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("苹果洗了吃。。。");
  //}
}
</div>

最后,创建水果工厂,代码如下:

//水果工厂
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;
  }
}
</div>

测试代码如下:

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();
  }
}
</div>

利用反射创建实例对象的常用三种方式:

// 方式一:使用 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();
    }
  }
}
</div>

希望本文所述对大家的C#程序设计有所帮助。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#定义简单的反射工厂实例分析
  • C#定义的MP3播放类实例
  • C#中自定义事件和委托实例

相关文章

  • 2017-05-28C#绘制中国国旗的方法
  • 2017-05-28c#异步操作后台运行(backgroundworker类)示例
  • 2017-05-28C#利用XML创建Excel文档的实现方法
  • 2017-05-28使用C#代码获取存储过程返回值
  • 2017-05-28C#实现屏幕拷贝的方法
  • 2017-05-28C#实现在线更新软件
  • 2017-05-28C#递归方法实现无限级分类显示效果实例
  • 2017-05-28winform实现拖动文件到窗体上的方法
  • 2017-05-28详解C#中的属性和属性的使用
  • 2017-05-28C# 表达式树Expression Trees的知识梳理

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#文件合并的方法
    • C#简单创建和删除目录的方法
    • C#图片按比例缩放实例
    • 解决C#中WebBrowser的DocumentCompleted事件不执行的实现方法
    • rsa加密算法使用示例分享
    • C#利用控件拖拽技术制作拼图游戏
    • c# 实现MD5,SHA1,SHA256,SHA512等常用加密算法源代码
    • 深入分析C#中处理和键盘相关事件的详解
    • winform c#中子窗体关闭刷新父窗体的实例
    • 字符串内存驻留机制详解示例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有