C# typeof() 和 GetType()區別

總得來說他們都是爲了獲取某個實例具體引用的數據類型System.Type。

1、GetType()方法繼承自Object,所以C#中任何對象都具有GetType()方法,x.GetType(),其中x爲變量名

2、typeof(x)中的x,必須是具體的類名、類型名稱等,不可以是變量名稱

3、System.Type.GetType(),有兩個重載方法

比如有這樣一個變量i:
Int32 i = new Int32();

使用GetType(),i.GetType()返回值是Int32的類型,但是無法使用typeof(i),因爲i是一個變量,

使用typeof(),則只能:typeof(Int32),返回的同樣是Int32的類型。

 

下面我們具體來看下相關類的介紹:

System.Type類
System.Type類定義了很多成員,可以用來檢查某個類型的元數據,它們返回的類型大多位於System.Reflection命名空間中。舉例來說,Type.GetMethods()返回一個MethodInfo類型的數組,Type.GetFields返回一個FieldInfo類型的數組等。System.Type提供的完整的成員組是很容易擴展的。


使用System.Object.GetType()得到Type引用
可以用多種方法得到一個Type類的實例。但是,由於Type是一個抽象類,所以不能直接使用new關鍵字創建一個Type對象。對此我們的首選是:使用System.Object定義的GetType()方法,它返回一個表示當前對象元數據的Type類的實例:

//使用一個SportsCar實例得到類型信息
SportsCar sc = new SportsCar();
Type t = sc.GetType();

顯而易見,要想使用這個方法,必須得到類型的編譯時信息(這裏是SportsCar類),並且當前在內存中類型實例。


使用typeof()得到Type引用
另一個取類型信息的方法是使用C# typeof操作符:

//使用typeof得到類型
Type t = typeof(SportsCar);

類似System.Object.GetType(),使用typeof操作符,我們不需要建立一個實例來提取類型信息。但是,仍然需要知道類型的編譯時信息,因爲typeof需要的是類型的強類型名稱,而不是文本表示。

 

使用System.Type.GetType()得到Type引用
爲了以更靈活的方式得到類型信息,我們可以調用System.Type類的靜態成員GetType(),然後指定類型的完全限定名。採用這種方法,我們不需要得到正從中提取元數據的類型的編譯時信息,

1)Type.GetType()方法被重載一:

允許我們指定兩個布爾類型的參數,一個用來控制當類型找不到時是否拋出異常,另一個用來指示是否區分字符串大小寫。

例如:
//使用靜態的Type.GetType()方法獲取類型信息(如果SportsCar沒有找到,則忽略不拋出異常信息)
Type t = Type.GetType("CarLibrary.SportsCar",false,true);

2)Type.GetType()方法被重載二:

在上面的例子中,注意傳入GetType()的字符串沒有包含類型所在的程序集信息。在這種情況下,該類型便被認爲是定義在當前執行的程序集中。但是,當希望得到一個外部私有程序集的類型元數據時,字符串參數必須使用類型完全限定名,加上類型所在的程序集的名字(每一個都用逗號隔開):

//得到外部程序集中類型的類型信息
Type t= Type.GetType("CarLibrary.SportsCar,CarLibrary");

 

示例代碼

using System;
using System.Reflection;
public class Program
{
    public int sampleMember;
    public void SampleMethod() { }
    static void Main()
    {
        Type t = typeof(Program);
        //也可通過下面這種方式操作
        //Program obj = new Program();
        //Type t = obj.GetType();
        Console.WriteLine("========Methods====================");
        MethodInfo[] methodInfo = t.GetMethods();
        foreach (MethodInfo mInfo in methodInfo)
            Console.WriteLine(mInfo.ToString());
        Console.WriteLine("========Members====================");
        MemberInfo[] memberInfo = t.GetMembers();
        foreach (MemberInfo mInfo in memberInfo)
            Console.WriteLine(mInfo.ToString());
        Console.ReadLine();
    }
}


運行結果如下

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章