關(guān)于C#基礎(chǔ)知識回顧--反射(一)
反射(reflection)是一種允許用戶獲得類型信息的C#特性。術(shù)語“反射”源自于它的工作方式:
Type對象映射它所代表的底層對象。對Type對象進(jìn)行查詢可以獲得(反射)與類型相關(guān)的信息。反射是一種
功能強大的機制,它允許學(xué)習(xí)和使用只在運行時才能知道的類型功能。
這些是官方定義,其實說白了,反射就是能知道我們未知類型的類型信息這么一個東西.沒什么神秘可講!
反射的核心是System.Type。System.Type包含了很多屬性和方法,使用這些屬性和方法可以在運行時得到類型信息。
一旦得到類型信息,就可以調(diào)用其構(gòu)造函數(shù)、方法和屬性。因此,反射允許使用編譯時不可用的代
碼。因為反射涉及內(nèi)容太多,我們主要學(xué)習(xí)常用的反射技術(shù)。
一、獲取方法的相關(guān)信息
一旦有了Type對象,就可以使用GetMethods()方法來獲取此類型支持的方法的列表。它的一種形式為:
MethodInfo[] GetMethods()
MethodInfo對象描述了主調(diào)類型所支持的方法,因此可以通過它的Name屬性獲得方法的名稱。同時它還有兩個重
要的方法,ReturnType和GetParameters()。
只讀屬性ReturnType為一個Type類型的對象,它為用戶提供方法的返回類型信息。
GetParameters()返回一個方法的參數(shù)列表,它的基本形式為:
ParameterInfo[] GetParameters();
參數(shù)信息保存在ParameterInfo對象中。ParameterInfo類定義了大量描述參數(shù)信息的屬性和方法。
其中常用屬性是Name和ParameterType,這兩個屬性我就不介紹了,從字面上應(yīng)該可以理解了。
好了,不說了,講了這么多概念想必大家都不耐煩了。下面我們先看代碼示例,估計你看了以后,再結(jié)合上面的
概念講解,你一定會說:哦,原來如此!??!
class MyClass
{
int x;
int y;
public MyClass(int i, int j)
{
x = i;
y = j;
}
public int Sum()
{
return x + y;
}
public bool IsBetween(int i)
{
if (x < i && i < y)
return true;
else
return false;
}
public void Set(int a, int b)
{
x = a;
y = b;
}
public void Set(double a, double b)
{
x = (int)a;
y = (int)b;
}
public void Show()
{
Console.WriteLine("x:{0},y:{1}", x, y);
}
}
運行結(jié)果:
請注意,除了MyClass定義的方法外,object定義的方法也會被顯示。這是因為C#所有的類都繼承于object。
另外,類型名稱(如Int32)采用的是.net結(jié)構(gòu)的名稱。
二、GetMethods()的另外一種形式
這種形式中可以指定各種標(biāo)記,以此篩選出想要獲取的方法,它的基本形式:
MethodInfo[] GetMethods(BindingFlags flags)
這種形式只獲得與所指定的條件相匹配的方法,BindingFlages 是一個枚舉,相關(guān)知識請參考:
msdn上BindingFlags 枚舉
可以使用OR運算符把兩個或者更多的標(biāo)記連接在一起。實際上,括號中至少應(yīng)包含Instance(或Static)
與Public(或NotPublic)標(biāo)記,否則將不會獲得任何方法。
GetMethods()方法的BindingFlages形式的一個主要用途在于,它可以只獲得某個類自身定義的方法而不
獲得它從基類繼承的方法,這對于object尤其有用。
例如用下列形式來替換前面程序中的GetMethods()語句:
MethodInfo[] mi = t.GetMethods(BindingFlags.DeclaredOnly |
BindingFlags.Instance |
BindingFlags.Public);
進(jìn)行上述更改后,程序的輸出結(jié)果為:

可以看出,這里只顯示了MyClass顯示定義的方法。
相關(guān)文章
C#利用反射技術(shù)實現(xiàn)去掉按鈕選中時的邊框效果
這篇文章主要介紹了C#利用反射技術(shù)實現(xiàn)去掉按鈕選中時的邊框效果,涉及C#針對窗口的參數(shù)設(shè)置技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-09-09