C#定义简单的反射工厂实例分析
本文实例讲述了C#定义简单的反射工厂用法。分享给大家供大家参考。具体分析如下:
首先,定义一个水果抽象类,代码如下:
classFruit
{
//定义虚方法
publicvirtualvoidEating()
{
Console.WriteLine("水果有各种吃法。。。");
}
}
然后,实例化几个水果类,代码如下:
classBanana:Fruit
{
publicoverridevoidEating()
{
Console.WriteLine("香蕉扒皮吃。。。");
}
}
classOrange:Fruit
{
publicoverridevoidEating()
{
Console.WriteLine("橘子剥皮吃。。。");
}
}
classApple:Fruit
{
publicnewvoidEating()
{
Console.WriteLine("苹果洗了吃。。。");
}
//publicoverridevoidEating()
//{
//Console.WriteLine("苹果洗了吃。。。");
//}
}
最后,创建水果工厂,代码如下:
//水果工厂
classFruitFactory
{
//生成水果
publicFruitCreateFruit(string_fruitname)
{
//不使用反射的做法如下:
//if("Apple"==_fruitname)
//{
//returnnewApple();
//}
//elseif("Banana"==_fruitname)
//{
//returnnewBanana();
//}
//elseif("Orange"==_fruitname)
//{
//returnnewOrange();
//}
//else
//{
//thrownewException("您指定的水果不生产!");
//}
//获得当前程序的命名空间
stringstrNamespace=Assembly.GetExecutingAssembly().GetName().Name;
//调用方法一:使用Type类
//Typetype=Type.GetType("ConsoleApplication1."+_fruitname);
//ConstructorInfoctorInfo=type.GetConstructor(System.Type.EmptyTypes);
////Invoke()方法:返回与构造函数关联的类的实例。
//FruitfruitA=(Fruit)ctorInfo.Invoke(newobject[0]);
//returnfruitA;
//调用方法二:使用Assembly类
//AssemblymyAssembly=Assembly.GetExecutingAssembly();
//FruitfruitB=(Fruit)myAssembly.CreateInstance("ConsoleApplication1."+_fruitname);
//returnfruitB;
//调用方法三:使用Activator类
FruitfruitC=(Fruit)Activator.CreateInstance(Type.GetType("ConsoleApplication1."+_fruitname,false,true));
returnfruitC;
}
}
测试代码如下:
classProgram
{
staticvoidMain(string[]args)
{
FruitFactoryff=newFruitFactory();
//打印(来自父类的):水果有各种吃法。。。
FruitfA=ff.CreateFruit("Apple");
fA.Eating();
//打印(来自子类的):苹果洗了吃。。。
Appleapple=ff.CreateFruit("Apple")asApple;
apple.Eating();
FruitfB=ff.CreateFruit("Banana");
fB.Eating();
FruitfC=ff.CreateFruit("Orange");
fC.Eating();
}
}
利用反射创建实例对象的常用三种方式:
//方式一:使用Type类
Typetype=Type.GetType("ConsoleApplication1."+_fruitname);
ConstructorInfoctorInfo=type.GetConstructor(System.Type.EmptyTypes);
//Invoke()方法:返回与构造函数关联的类的实例。
FruitfruitA=(Fruit)ctorInfo.Invoke(newobject[0]);
returnfruitA;
//方式二:使用Assembly类
AssemblymyAssembly=Assembly.GetExecutingAssembly();
FruitfruitB=(Fruit)myAssembly.CreateInstance("ConsoleApplication1."+_fruitname);
returnfruitB;
//方式三:使用Activator类
FruitfruitC=(Fruit)Activator.CreateInstance(Type.GetType("ConsoleApplication1."+_fruitname,false,true));
returnfruitC;
示例的全部代码如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Reflection;
//抽象类可以继承抽象类
namespaceConsoleApplication1
{
classFruit
{
//定义虚方法
publicvirtualvoidEating()
{
Console.WriteLine("水果有各种吃法。。。");
}
}
//水果工厂
classFruitFactory
{
//生成水果
publicFruitCreateFruit(string_fruitname)
{
//不使用反射的做法如下:
//if("Apple"==_fruitname)
//{
//returnnewApple();
//}
//elseif("Banana"==_fruitname)
//{
//returnnewBanana();
//}
//elseif("Orange"==_fruitname)
//{
//returnnewOrange();
//}
//else
//{
//thrownewException("您指定的水果不生产!");
//}
//获得当前程序的命名空间
stringstrNamespace=Assembly.GetExecutingAssembly().GetName().Name;
//调用方法一:使用Type类
//Typetype=Type.GetType("ConsoleApplication1."+_fruitname);
//ConstructorInfoctorInfo=type.GetConstructor(System.Type.EmptyTypes);
////Invoke()方法:返回与构造函数关联的类的实例。
//FruitfruitA=(Fruit)ctorInfo.Invoke(newobject[0]);
//returnfruitA;
//调用方法二:使用Assembly类
//AssemblymyAssembly=Assembly.GetExecutingAssembly();
//FruitfruitB=(Fruit)myAssembly.CreateInstance("ConsoleApplication1."+_fruitname);
//returnfruitB;
//调用方法三:使用Activator类
FruitfruitC=(Fruit)Activator.CreateInstance(Type.GetType("ConsoleApplication1."+_fruitname,false,true));
returnfruitC;
}
}
classBanana:Fruit
{
publicoverridevoidEating()
{
Console.WriteLine("香蕉扒皮吃。。。");
}
}
classOrange:Fruit
{
publicoverridevoidEating()
{
Console.WriteLine("橘子剥皮吃。。。");
}
}
classApple:Fruit
{
publicnewvoidEating()
{
Console.WriteLine("苹果洗了吃。。。");
}
//publicoverridevoidEating()
//{
//Console.WriteLine("苹果洗了吃。。。");
//}
}
classProgram
{
staticvoidMain(string[]args)
{
FruitFactoryff=newFruitFactory();
//打印(来自父类的):水果有各种吃法。。。
FruitfA=ff.CreateFruit("Apple");
fA.Eating();
//打印(来自子类的):苹果洗了吃。。。
Appleapple=ff.CreateFruit("Apple")asApple;
apple.Eating();
FruitfB=ff.CreateFruit("Banana");
fB.Eating();
FruitfC=ff.CreateFruit("Orange");
fC.Eating();
}
}
}
希望本文所述对大家的C#程序设计有所帮助。