日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

定义简单的反射工厂示例

發(fā)布時(shí)間:2025/7/14 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 定义简单的反射工厂示例 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


首先,定義一個(gè)水果抽象類,代碼如下:

class?Fruit
{
????
//定義虛方法
????public?virtual?void?Eating()
????{
????????Console.WriteLine(
"水果有各種吃法。。。");
????}
}

?

然后,實(shí)例化幾個(gè)水果類,代碼如下:

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

?

最后,創(chuàng)建水果工廠,代碼如下:

//水果工廠
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("您指定的水果不生產(chǎn)!");
????????
//}

????????
//獲得當(dāng)前程序的命名空間
????????string?strNamespace?=?Assembly.GetExecutingAssembly().GetName().Name;

????????
//調(diào)用方法一:使用?Type?類
????????
//Type?type?=?Type.GetType("ConsoleApplication1."?+?_fruitname);
????????
//ConstructorInfo?ctorInfo?=?type.GetConstructor(System.Type.EmptyTypes);
????????////?Invoke()方法:返回與構(gòu)造函數(shù)關(guān)聯(lián)的類的實(shí)例。
????????//Fruit?fruitA?=?(Fruit)ctorInfo.Invoke(new?object[0]);
????????
//return?fruitA;

????????
//調(diào)用方法二:使用?Assembly?類
????????
//Assembly?myAssembly?=?Assembly.GetExecutingAssembly();
????????
//Fruit?fruitB?=?(Fruit)myAssembly.CreateInstance("ConsoleApplication1."?+?_fruitname);
????????
//return?fruitB;

????????
//調(diào)用方法三:使用?Activator?類
????????Fruit?fruitC?=?(Fruit)Activator.CreateInstance(Type.GetType("ConsoleApplication1."?+?_fruitname,?false,?true));
????????
return?fruitC;
????}
}

?

測(cè)試代碼如下:

class?Program
{
????
static?void?Main(string[]?args)
????{
????????FruitFactory?ff?
=?new?FruitFactory();

????????
//打印(來(lái)自父類的):水果有各種吃法。。。
????????Fruit?fA?=?ff.CreateFruit("Apple");
????????fA.Eating();

????????
//打印(來(lái)自子類的):蘋果洗了吃。。。
????????Apple?apple?=?ff.CreateFruit("Apple")?as?Apple;
????????apple.Eating();

????????Fruit?fB?
=?ff.CreateFruit("Banana");
????????fB.Eating();

????????Fruit?fC?
=?ff.CreateFruit("Orange");
????????fC.Eating();
????}
}

?

?

利用反射創(chuàng)建實(shí)例對(duì)象的常用三種方式:

// 方式一:使用 Type 類
Type?type?=?Type.GetType("ConsoleApplication1."?+?_fruitname);
ConstructorInfo?ctorInfo?=?type.GetConstructor(System.Type.EmptyTypes);
//?Invoke()方法:返回與構(gòu)造函數(shù)關(guān)聯(lián)的類的實(shí)例。
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("您指定的水果不生產(chǎn)!");
????????????
//}

????????????
//獲得當(dāng)前程序的命名空間
????????????string?strNamespace?=?Assembly.GetExecutingAssembly().GetName().Name;

????????????
//調(diào)用方法一:使用?Type?類
????????????
//Type?type?=?Type.GetType("ConsoleApplication1."?+?_fruitname);
????????????
//ConstructorInfo?ctorInfo?=?type.GetConstructor(System.Type.EmptyTypes);
????????????////?Invoke()方法:返回與構(gòu)造函數(shù)關(guān)聯(lián)的類的實(shí)例。
????????????//Fruit?fruitA?=?(Fruit)ctorInfo.Invoke(new?object[0]);
????????????
//return?fruitA;

????????????
//調(diào)用方法二:使用?Assembly?類
????????????
//Assembly?myAssembly?=?Assembly.GetExecutingAssembly();
????????????
//Fruit?fruitB?=?(Fruit)myAssembly.CreateInstance("ConsoleApplication1."?+?_fruitname);
????????????
//return?fruitB;

????????????
//調(diào)用方法三:使用?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();

????????????
//打印(來(lái)自父類的):水果有各種吃法。。。
????????????Fruit?fA?=?ff.CreateFruit("Apple");
????????????fA.Eating();

????????????
//打印(來(lái)自子類的):蘋果洗了吃。。。
????????????Apple?apple?=?ff.CreateFruit("Apple")?as?Apple;
????????????apple.Eating();

????????????Fruit?fB?
=?ff.CreateFruit("Banana");
????????????fB.Eating();

????????????Fruit?fC?
=?ff.CreateFruit("Orange");
????????????fC.Eating();
????????}
????}
}

?

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的定义简单的反射工厂示例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。