对“反射”的深入认识,你会发觉跟“解剖”一样
對很多人來說,對.Net的反射機制不甚了解,其實反射是一種很優秀的機制,知道了它,就可以把握很多程序的脈搏。如何這樣說呢?首先,反射是這樣定義的:可以在運行時根據所提供的類庫(.dll)來進行解析以獲得其中包含的類型(包含類、結構、委托、接口、枚舉等)成員,進而獲取到對應的方法、屬性、事件以及構造函數等(甚至可獲得對應的名稱、限定符和參數)信息。有了這些信息,我們就可以動態的創建對象,即使在編譯時不知道對象的類型也無所謂。打個比方:反射好比人體解剖,可以給一個完整的人(^^哈哈,當然是死人哈,這里類比一個.dll文件),通過解剖(反射)就可以獲取對應的部位(成員),進而利用這些部位去做更多的事情(如利用DNA克隆)。是不是很神奇啊!下面我們以一個完整的例子來說明:
1. 首先建立一個類型庫項目(Library),并添加一個類Person,生成一個類庫程序集(Library.dll)。
namespace Library{
public class Person
{
private string name;
private string sex;
private int age;
public Person() : this(null) { }
public Person(string name)
{
this.name = name;
}
public string Name
{
get { return name; }
set { name = value; }
}
public string Sex
{
get { return sex; }
set { sex = value; }
}
public int Age
{
get { return age; }
set { age = value; }
}
public void Say()
{
if (name == null)
{
Console.WriteLine("Hello World");
}
else
{
Console.WriteLine("Hello " + name);
}
}
}
}
2. 再建立一個控制臺(測試)項目Test,并將Library.dll拷貝到本項目的bin/debug目錄下。特別注意的是,在此項目中必須添加System.Reflection。
using System.Reflection; static void Main(string[] args){
Console.WriteLine("列出程序集Library.dll中的所有類型");
Assembly asm = Assembly.LoadFrom("Library.dll");
Type person = null;
Type[] types = asm.GetTypes();
foreach (Type t in types)
{
Console.WriteLine(t.Name);
if (t.Name == "Person")
{
person = t;
}
}
Console.WriteLine("列出類型Person的所有方法");
MethodInfo[] methods = person.GetMethods();
foreach (MethodInfo mi in methods)
{
Console.WriteLine(mi.Name);
}
Console.WriteLine("實例化類型Person并調用方法Say()");
object obj = Activator.CreateInstance(person);
object miracle = Activator.CreateInstance(person, "Miracle");
MethodInfo say = person.GetMethod("Say");
say.Invoke(obj, null);//輸出Hello World
say.Invoke(miracle, null);//輸出Hello Miracle
}
從以上兩點就可以完整地看到反射的過程,類似于.NET的反編譯機制(有興趣的朋友可以去研究一下IDASM和Reflector工具)。
轉載于:https://www.cnblogs.com/hmiinyu/archive/2011/11/10/2244828.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的对“反射”的深入认识,你会发觉跟“解剖”一样的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VOA AGRICULTURE REPO
- 下一篇: 内核对象之信号量