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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

对“反射”的深入认识,你会发觉跟“解剖”一样

發布時間:2025/3/8 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对“反射”的深入认识,你会发觉跟“解剖”一样 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對很多人來說,對.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年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的对“反射”的深入认识,你会发觉跟“解剖”一样的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。