如何獲取乙個型別引用

2021-04-22 15:27:04 字數 1902 閱讀 1926

原著: andrew troelsen pro c# 2008 and the .net 3.5 platform, fourth edition

system.type

類定義了一些成員,可以用來檢視某個型別的元資料,其中很多成員都返回system.reflection名字空間中的型別。例如,type.getmethods()返回乙個methodinfo陣列,type.getfields()返回乙個fieldinfo陣列,等等。

獲取type引用的幾種方法:

使用system.object.gettype()獲取乙個型別引用

你可以使用多種方法獲得乙個type類的例項。然而,你不能使用new關鍵字直接建立乙個type物件,因為type是乙個抽象類。首先,回想一下,system.object定義了乙個稱為gettype()的方法,它返回乙個表示當前物件元資料的type類的例項。

//使用乙個sportscar例項獲取型別資訊

sportscar sc = new sportscar();

type t = sc.gettype();

很明顯,僅當你擁有型別的編譯時知識(此處為sportscar)以及當前在記憶體中存在乙個此型別的例項時,這個方法才能工作。

使用system.type.gettype()獲取乙個型別引用

為了靈活性,你可以呼叫system.type類的靜態成員gettype(),並指定型別的全限定名。使用這種方法,你不必擁有型別的編譯時知識,因為type.gettype()以system.string物件作為引數。

//使用靜態方法type.gettype()獲取型別資訊,第二個引數指出如果找不到sportscar型別不丟擲異常,第三個引數指出忽略大小寫。

type t = type.gettype(

「carlibrary.sportscar

」, false, true);

在這個例子中並沒有提起包含型別的程式集。在這種情況下,假設型別定義在當前執行的程式集中。然而,如果你想獲取乙個外部私有程式集中某個型別的元資料,字串引數格式為型別的許可權定名,緊跟著包含型別的程式集的友好名(friendly name),以逗號分隔。

type t = type.gettype(

「carlibrary.sportscar, carlibrary」);

另外,傳遞給type.gettype()的字串也可以使用加號(+)表示巢狀型別。假設你想獲取乙個巢狀在jamescar類中的spyoptions列舉的型別資訊,那麼你可以這樣編碼:

type t = type.gettype(

「carlibrary.jamescar+spyoptions」);

使用typeof()獲取乙個型別引用

最後一種方法是使用c#的typeof運算子:

type t = typeof(sportcar);

與type.gettype()相比,使用這種方法你不必建立乙個物件例項就可以獲取它的型別資訊。

但是,你必須擁有你所感興趣的型別的編譯時知識,因為typeof希望引數是型別的強型別名而不只是型別的文字表示。

疑惑?

還是在這裡簡單的回答一下那位網友的問題吧。由於我對soa不甚了解,在這裡也只能說說自己的看法。類似於soa,remoting或者wcf之類的技術都是基於**模式的,也就是說不管在伺服器端還是在客戶端,你都是和**物件互動,你並不能得到**背後的物件,當然也就不能對其進行反射。

但是你所說的情況為它是乙個方法的引數,此時伺服器端必須擁有定義此型別程式集的引用,否則不能編譯通過,所以說連編譯都不能通過更別提反**。

另外,反射的前提是必須擁有某個型別的元資料資訊,一般都儲存在定義型別的程式集中。.net好像可以通過程式設計動態建立型別,不過我並沒有研究過,因此不敢妄下結論。

乙個有趣的問題 如何獲取引用名

我們知道,對於 a 100 這樣的一條語句,a是乙個指向 100 這個物件的引用.那麼,如何根據a得到它的名字 a 或者符號 a 我現在實現了乙個 swap 函式,它的作用是交換兩個變數的值,由於ruby沒有類似c的 指標 所以這個swap實現起來還真有點麻煩 a 100 b 200 def swa...

引用型別(乙個有趣的問題)

public static void main string args test test tests n test.id 10 這裡沒有問題,修改test.id會導致tests i id一起更改 test tests n test null 這裡有問題,修改test null,但是 tests i...

C 獲取乙個陣列的型別

假如我有乙個vector3型別的陣列 vector3 array 在獲取陣列的子陣列的時候,用多種方式 用linq的skip方法,但是才unity 中,如果大量使用linq語句,有可能造成效能上的損耗 用array.copy方法,它有多種過載的方法,我使用其中一種 reliabilitycontra...