定義簡單的反射工廠示例
首先,定義一個水果抽象類,代碼如下:
class Fruit
{
//定義虛方法
public virtual void Eating()
{
Console.WriteLine("水果有各種吃法。。。");
}
}
{
//定義虛方法
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("蘋果洗了吃。。。");
//}
}
{
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 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();
//打?。▉碜愿割惖模核懈鞣N吃法。。。
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();
}
}
{
static void Main(string[] args)
{
FruitFactory ff = new FruitFactory();
//打?。▉碜愿割惖模核懈鞣N吃法。。。
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;
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;
Fruit fruitB = (Fruit)myAssembly.CreateInstance("ConsoleApplication1." + _fruitname);
return fruitB;
// 方式三:使用 Activator 類
Fruit fruitC = (Fruit)Activator.CreateInstance(Type.GetType("ConsoleApplication1." + _fruitname, false, true));
return fruitC;
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();
//打?。▉碜愿割惖模核懈鞣N吃法。。。
Fruit fA = ff.CreateFruit("Apple");
fA.Eating();
//打?。▉碜宰宇惖模禾O果洗了吃。。。
Apple apple = ff.CreateFruit("Apple") as Apple;
apple.Eating();
Fruit fB = ff.CreateFruit("Banana");
fB.Eating();
Fruit fC = ff.CreateFruit("Orange");
fC.Eating();
}
}
}
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();
//打?。▉碜愿割惖模核懈鞣N吃法。。。
Fruit fA = ff.CreateFruit("Apple");
fA.Eating();
//打?。▉碜宰宇惖模禾O果洗了吃。。。
Apple apple = ff.CreateFruit("Apple") as Apple;
apple.Eating();
Fruit fB = ff.CreateFruit("Banana");
fB.Eating();
Fruit fC = ff.CreateFruit("Orange");
fC.Eating();
}
}
}
| 作者: XuGang 網名:鋼鋼 |
| 出處: http://xugang.cnblogs.com |
| 聲明: 本文版權歸作者和博客園共有。轉載時必須保留此段聲明,且在文章頁面明顯位置給出原文連接地址! |

浙公網安備 33010602011771號