0. 基礎概念
0.1 什么是反射
Reflection,中文翻譯為反射。
這是.Net中獲取運行時類型信息的方式。
官方定義:
審查元數(shù)據(jù)并收集關于它的類型信息的能力。
元數(shù)據(jù)(編譯以后的最基本數(shù)據(jù)單元)
就是一大堆的表,當編譯程序集或者模塊時,編譯器會創(chuàng)建一個類定義表,一個字段定義表,和一個方法定義表等。
.Net的應用程序的結構由以下幾個部分組成:
-
程序集(Assembly)
-
模塊(Module)
-
類型(class)
而反射的層次模型也類似上述結構:
- 程序集反射
- 類型反射
- 類型成員反射
而反射提供一種編程的方式,讓程序員可以在程序運行期獲得這幾個組成部分的相關信息。
-
Assembly類
可以獲得正在運行的裝配件信息,也可以動態(tài)的加載裝配件,以及在裝配件中查找類型信息,并創(chuàng)建該類型的實例。 -
Type類
可以獲得對象的類型信息,此信息包含對象的所有要素:方法、構造器、屬性等等
通過Type類可以得到這些要素的信息,并且調用。 -
MethodInfo
包含方法的信息,通過這個類可以得到方法的名稱、參數(shù)、返回值等等
并且可以調用。
諸如此類,還有FieldInfo、EventInfo等等,這些類都包含在System.Reflection命名空間下。
0.2 命名空間與裝配件的關系
- 命名空間類似與Java的包,但又不完全等同
因為Java的包必須按照目錄結構來放置,命名空間則不需要。 - 裝配件是.Net應用程序執(zhí)行的最小單位,編譯出來的.dll、.exe都是裝配件。
裝配件和命名空間的關系不是一一對應,也不互相包含
一個裝配件里面可以有多個命名空間,一個命名空間也可以在多個裝配件中存在。
例如:
裝配件A:
namespace N1
{
public class AC1 {…}
public class AC2 {…}
}
namespace N2
{
public class AC3 {…}
public class AC4{…}
}
裝配件B:
namespace N1
{
public class BC1 {…}
public class BC2 {…}
}
namespace N2
{
public class BC3 {…}
public class BC4{…}
}
這兩個裝配件中都有N1和N2兩個命名空間,而且各聲明了兩個類,這樣是完全可以的
然后我們在一個應用程序中引用裝配件A
那么在這個應用程序中,我們能看到N1下面的類為AC1和AC2,N2下面的類為AC3和AC4。
接著我們?nèi)サ魧的引用,加上對B的引用
那么我們在這個應用程序下能看到的N1下面的類變成了BC1和BC2,N2下面也一樣。
如果我們同時引用這兩個裝配件
那么N1下面我們就能看到四個類:AC1、AC2、BC1和BC2。
裝配件是一個類型 “居住” 的地方,那么在一個程序中要使用一個類,就必須告訴編譯器這個類住在哪兒,編譯器才能找到它,也就是說必須引用該裝配件。
那么如果在編寫程序的時候,也許不確定這個類在哪里,僅僅只是知道它的名稱,就不能使用了嗎?
答案是可以,這就是反射了,就是在程序運行的時候提供該類型的地址,而去找到它。
0.3 使用反射的情景
舉個例子來說明:
很多軟件開發(fā)者喜歡在自己的軟件中留下一些接口,其他人可以編寫一些插件來擴充軟件的功能。
比如我有一個媒體播放器,我希望以后可以很方便的擴展識別的格式,那么我聲明一個接口:
public interface IMediaFormat
{
string Extension {get;}
Decoder GetDecoder();
}
這個接口中包含一個Extension屬性,這個屬性返回支持的擴展名。
另一個方法返回一個解碼器的對象(這里我假設了一個Decoder的類,這個類提供把文件流解碼的功能,擴展插件可以派生之),通過解碼器對象我就可以解釋文件流。
那么我規(guī)定所有的解碼插件都必須派生一個解碼器,并且實現(xiàn)這個接口,在GetDecoder方法中返回解碼器對象,并且將其類型的名稱配置到我的配置文件里面。
這樣的話,我就不需要在開發(fā)播放器的時侯知道將來擴展的格式的類型,只需要從配置文件中獲取現(xiàn)在所有解碼器的類型名稱,而動態(tài)的創(chuàng)建媒體格式的對象,將其轉換為IMediaFormat接口來使用。
這就是一個反射的典型應用。
1. 反射的用途
反射的作用:文章來源:http://www.zghlxwxcb.cn/news/detail-470970.html
-
它允許在運行時查看屬性(attribute&#文章來源地址http://www.zghlxwxcb.cn/news/detail-470970.html
到了這里,關于C# 反射機制詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!