反射(Reflection)是.NET中的重要機制,通過反射,可以在運行時獲得.NET中每一個類型(包括類、結構、委托、接口和枚舉等)的成員,包括方法、屬性、事件,以及構造函數等。還可以獲得每個成員的名稱、限定符和參數等。有了反射,即可對每一個類型了如指掌。如果獲得了構造函數的信息,即可直接創建對象,即使這個對象的類型在編譯時還不知道。
Assembly就是反應反射的一種應用,它定義和加載程序集,加載在程序集清單中列出模塊,以及從此程序集中查找類型並創建該類型的實例。簡單地說就是,使用Assembly在程序中你不用事先寫比如下面的東西了:
PersonClass person = new PersonClass();
person.Method();
你只要知道PersonClass這個類的程序集,命名空間和類名直接使用反射就可以使用。你只需要這樣寫:
PersonClass person;
person =
person = (PersonClass)(Assembly.Load("程序集").CreateInstance("命名空間.類名", false, BindingFlags.Default, null, args, null, null));
person.Method();
下面用一個小例子來看看Assembly應用的方便性。
需求:有幾種文件格式,後綴分別是.One,.Two,.Three,... 有很多種,後續還可能增加。這些文件的格式都不一樣,也就是說讀取方式就不一樣。那麼根據傳入的文件後綴和路徑讀出文件的內容。
實現:
這種需求的特點是,根據選擇做不同的處理,但是都是出的一種結果,那麼可以使用簡單工廠模式來完成。
讀取文件有一個父類FileSuper,內部如下:
using System;
using System.Collections.Generic;
using System.Text;
namespace reflect
{
public abstract class FileSuper//獲取不同後綴名文件的內容
{
public abstract string GetFileContext(string fileFullPath);
}
}
分別有MyFileOne,MyFileTwo,MyFileThree等,繼承FileSuper,如下:
using System;
using System.Collections.Generic;
using System.Text;
namespace reflect
{
public class MyFileOne : FileSuper
{
public override string GetFileContext(string fileFullPath)
{
return "One類型文件的內容";
}
}
}using System;
using System.Collections.Generic;
using System.Text;
namespace reflect
{
public class MyFileTwo : FileSuper
{
public override string GetFileContext(string fileFullPath)
{
return "Two類型文件的內容";
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace reflect
{
public class MyFileThree : FileSuper
{
public override string GetFileContext(string fileFullPath)
{
return "Three類型文件的內容";
}
}
}
一個工廠類根據後綴名決定實例化哪個類:
using System;
using System.Collections.Generic;
using System.Text;
namespace reflect
{
public class OperationFile
{
static FileSuper fileSuper = null;
public static string GetStringByFile(string fileFullPath, string extendName)
{
switch (extendName)
{
case "One":
fileSuper = new MyFileOne();
break;
case "Two":
fileSuper = new MyFileTwo();
break;
case "Three":
fileSuper = new MyFileThree();
break;
}
if (fileSuper != null)
{
return fileSuper.GetFileContext(fileFullPath);
}
return "沒有指定的類型";
}
}
}
客戶端調用,顯示結果:
using System;
using System.Collections.Generic;
using System.Text;
namespace reflect
{
public class Program
{
static void Main(string[] args)
{
string fileContext = OperationFile.GetStringByFile("路徑", "One");
Console.WriteLine(fileContext);
Console.ReadLine();
}
}
}