时间:2021-05-20
本文实例讲述了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#程序设计有所帮助。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了C#反射应用。分享给大家供大家参考。具体如下:通过反射实现多系统数据库的配置通过定义接口,反射实例化配置的节点的值配置App.config:复制代
本文实例讲述了C#省份城市下拉框联动简单实现方法。分享给大家供大家参考。具体分析如下:复制代码代码如下://定义字典DictionaryAddress=newD
本文实例讲述了C#事件用法。分享给大家供大家参考。具体分析如下:EventHandler的定义如下publicdelegatevoidEventHandler(
本文实例讲述了C#自定义简化cookie类。分享给大家供大家参考。具体分析如下:这个C#类封装了常用的cookie操作,包括读取cookie、写入cookie、
本文实例讲述了C#根据反射和特性实现ORM映射的方法。分享给大家供大家参考。具体如下:(一)关于反射什么是反射?反射就是在运行时,动态获取对象信息的方法。比如: