C#定义简单的反射工厂实例分析
程序员文章站
2023-12-11 18:20:34
本文实例讲述了c#定义简单的反射工厂用法。分享给大家供大家参考。具体分析如下:
首先,定义一个水果抽象类,代码如下:
class fruit
{
//定...
本文实例讲述了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#程序设计有所帮助。