定义简单的反射工厂示例
生活随笔
收集整理的這篇文章主要介紹了
定义简单的反射工厂示例
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先,定義一個水果抽象類,代碼如下:
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;
????}
}
?
測試代碼如下:
{
????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;
示例的全部代碼如下:
View Code 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();
????????}
????}
}
?
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的定义简单的反射工厂示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DLL返回自定义结构的数组
- 下一篇: poj2562