標籤:style blog http io ar color 使用 sp 檔案
最近想研究一下反射,先上網找了找資料,幾乎大部分都是照抄MSDN的內容,生澀難懂,幾乎沒說,又找了找,發現一些強人的執行個體解析,才稍微有了 點門道,個人感覺,反射其實就是為了能夠在程式運行期間動態載入一個外部的DLL集合,然後通過某種辦法找到這個DLL集合中的某個空間下的某個類的某 個成員(通過反射可以訪問該類所包含的所有成員,不論成員是公有還是私人),看看網上N人寫的執行個體:
1.運用反射調用其它程式集中的方法:
假設另一個工程中的所有類都編譯到一個dll檔案中了,在這很多的類當中,有一個類叫StringUtil,名稱空間在 HSMP.CommonBasic.Common下
該類中有一個方法:
public double GetSum(double x,double y)
{
return x+y;
}
編譯後dll檔案的存放路徑是:D:\Test\HSMP.CommonBasic.dll
現在的問題是,如何通過程式調用該dll檔案中的GetSum方法
大概有以下幾步:
using System.Reflection;
A.
//這裡要用LoadFrom,只有在本工程裡添加了該dll的引用後才可以使用Load
Assembly objAss = Assembly.LoadFrom(@"D:\Test\HSMP.CommonBasic.dll");
//HSMP.CommonBasic.Common.StringUtil類的全路徑
Type t=objAss.GetType("HSMP.CommonBasic.Common.StringUtil");
//動態產生類StringUtil的執行個體
object obj=System.Activator.CreateInstance(t);
//參數資訊,GetSum需要兩個int參數,如果方法沒有參數,就聲明一個長度為0的數組
System.Type[] paramTypes = new System.Type[2];
paramTypes[0] = System.Type.GetType("System.Int32");
paramTypes[1] = System.Type.GetType("System.Int32");
//找到對應的方法
MethodInfo p = t.GetMethod("SayHello", paramTypes)
//參數值,如果所調用的方法沒有參數,不用寫這些
Object[] parameters = new Object[2];
parameters[0] = 3;
parameters[1] = 4;
object objRetval = p.Invoke(obj, parameters); //如果沒有參數,寫null即可。
2.動態載入, 更改, 增加...某個程式集
下面例子中, ChangeValue類的myValue本是私人欄位,
一般情況下在類外部是不能改它的值的, 但利用反射就能改了
-----------------------------------------------------
using System;
using System.Reflection;
class ChangeValue
{
private string myValue;
public ChangeValue(string str)
{
myValue = str;
}
public void WriteLine()
{
Console.WriteLine("MyValue is: " + myValue);
}
}
class Test
{
public static void Main(string[] args)
{
ChangeValue cv = new ChangeValue("old value");
cv.WriteLine();
Type t = cv.GetType();
FieldInfo field = t.GetField("myValue",
BindingFlags.NonPublic |BindingFlags.Instance);
field.SetValue(cv, "new value");
cv.WriteLine();
}
}
----------------------------------------------------
再打個比方, 你要寫一個播放器, 要支援如mp3, wmv, avi...等格式,
你還希望使用者能自己安裝一個新的格式, 也就是我們常說的外掛程式.
在實現這些, 可能你要將每種格式都寫成單個的解碼程式集, 如
mp3.dll, wmv.dll, avi.dll....
這樣當播放時, 根據副檔名去動態調用相應的解碼程式集, 那麼這時你就得
用反射去動態載入這些dll了.如: Assembly.LoadFile ("...avi.dll")
然後通過反射可以用avi.dll裡面定義的類了
轉自:http://www.cnblogs.com/kingcat/archive/2007/09/03/879873.html
C# 的反射和映射