1. 程式人生 > 其它 >C#基礎知識回顧-- 反射(1)

C#基礎知識回顧-- 反射(1)

反射(reflection)是一種允許使用者獲得型別資訊的C#特性。術語“反射”源自於它的工作方式:

Type物件對映它所代表的底層物件。對Type物件進行查詢可以獲得(反射)與型別相關的資訊。反射是一種

功能強大的機制,它允許學習和使用只在執行時才能知道的型別功能。

  這些是官方定義,其實說白了,反射就是能知道我們未知型別的型別資訊這麼一個東西.沒什麼神祕可講!

反射的核心是System.Type。System.Type包含了很多屬性和方法,使用這些屬性和方法可以在執行時得到型別資訊。

一旦得到型別資訊,就可以呼叫其建構函式、方法和屬性。因此,反射允許使用編譯時不可用的代

碼。因為反射涉及內容太多,我們主要學習常用的反射技術。

一、獲取方法的相關資訊

  一旦有了Type物件,就可以使用GetMethods()方法來獲取此型別支援的方法的列表。它的一種形式為:

MethodInfo[] GetMethods()

  MethodInfo物件描述了主調型別所支援的方法,因此可以通過它的Name屬性獲得方法的名稱。同時它還有兩個重

要的方法,ReturnType和GetParameters()。

  只讀屬性ReturnType為一個Type型別的物件,它為使用者提供方法的返回型別資訊。

  GetParameters()返回一個方法的引數列表,它的基本形式為:

 ParameterInfo[] GetParameters()

  引數資訊儲存在ParameterInfo物件中。ParameterInfo類定義了大量描述引數資訊的屬性和方法。

其中常用屬性是Name和ParameterType,這兩個屬性我就不介紹了,從字面上應該可以理解了。

好了,不說了,講了這麼多概念想必大家都不耐煩了。下面我們先看程式碼示例,估計你看了以後,再結合上面的

概念講解,你一定會說:哦,原來如此!!!

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);
        }
    }

執行結果:

  請注意,除了MyClass定義的方法外,object定義的方法也會被顯示。這是因為C#所有的類都繼承於object。

另外,型別名稱(如Int32)採用的是.net結構的名稱。

二、GetMethods()的另外一種形式   這種形式中可以指定各種標記,以此篩選出想要獲取的方法,它的基本形式:

MethodInfo[] GetMethods(BindingFlags flags)

這種形式只獲得與所指定的條件相匹配的方法,BindingFlages 是一個列舉,相關知識請參考:

msdn上BindingFlags 列舉

  可以使用OR運算子把兩個或者更多的標記連線在一起。實際上,括號中至少應包含Instance(或Static)

與Public(或NotPublic)標記,否則將不會獲得任何方法。

  GetMethods()方法的BindingFlages形式的一個主要用途在於,它可以只獲得某個類自身定義的方法而不

獲得它從基類繼承的方法,這對於object尤其有用。

例如用下列形式來替換前面程式中的GetMethods()語句:

MethodInfo[] mi = t.GetMethods(BindingFlags.DeclaredOnly |
BindingFlags.Instance |
BindingFlags.Public);

進行上述更改後,程式的輸出結果為:

可以看出,這裡只顯示了MyClass顯示定義的方法。

未完待續……

PS:由於工作原因,本打算今天的更新可能要推遲到週六實在抱歉……