《随笔九》——C#中的 “ typeof运算符 和 GetType() 函数”

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34536551/article/details/84099078

●  C#中任何对象都具有GetType()方法,x.GetType(),其中x为变量名。它的作用和typeof()相同,返回Type类型的当前对象的类型。

typeof(x)中的x,必须是具体的类名、类型名称等,不可以是变量名称;GetType()是基类System.Object的方法,因此只有建立一个实例之后才能够被调用.

System.Type.GetType(),有两个重载方法,  typeof 不能重载。

比如有这样一个变量i: 

Int32 i = new Int32(); 

使用GetType(),i.GetType()返回值是Int32的类型,但是无法使用typeof(i),因为i是一个变量,

使用typeof(),则只能:typeof(Int32),返回的同样是Int32的类型。

两者区别:

  1、typeof是运算符而不是方法

  2、GetType()是基类System.Object的方法,因此只有建立一个实例之后才能够被调用(初始化以后)

  3、typeof的参数只能是内置类型 ,自定义类型,且不能是实例

扫描二维码关注公众号,回复: 4107621 查看本文章

  4、GetType()和typeof都返回System.Type的引用.

  5、typeof():得到一个Class的Type

  6、 GetType():得到一个实例的Type

下面我们具体来看下相关类的介绍:

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(),然后指定类型的完全限定名。采用这种方法,我们不需要得到正从中提取元数据的类型的编译时信息,

Type.GetType()方法被重载一:

允许我们指定两个布尔类型的参数,一个用来控制当类型找不到时是否抛出异常,另一个用来指示是否区分字符串大小写。

例如:

//使用静态的Type.GetType()方法获取类型信息(如果SportsCar没有找到,则忽略不抛出异常信息)
Type t = Type.GetType("CarLibrary.SportsCar",false,true);

 


Type.GetType()方法被重载二:

在上面的例子中,注意传入GetType()的字符串没有包含类型所在的程序集信息。在这种情况下,该类型便被认为是定义在当前执行的程序集中。但是,当希望得到一个外部私有程序集的类型元数据时,字符串参数必须使用类型完全限定名,加上类型所在的程序集的名字(每一个都用逗号隔开):

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

#region Using directives
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using static System.Console;
using static System.Convert;

#endregion
using System.Reflection; //使用反射命名空间来全面利用检测类型信息的功能

namespace Ch05Ex03
{
    class SomeClass
    {
        public int Field1;
        public int Field2;

        public
        void Method1()
        { }
       public
            int Method2()
        {
            return 1;
        }

    }
  
    class Program
    {
        static void Main(string[] args)
        {
            Type t = typeof(SomeClass);

            FieldInfo[] fi = t.GetFields();
            MethodInfo[] mi = t.GetMethods();

            foreach(FieldInfo f in fi)
            {
                WriteLine("Filed: {0}",f.Name);
            }
            WriteLine();
            foreach (MethodInfo m in mi)
            {
                WriteLine("Method: {0}", m.Name);
            }
            ReadKey();
        }
    }
}

输出结果为:

Filed: Field1
Filed: Field2

Method: Method1
Method: Method2
Method: ToString
Method: Equals
Method: GetHashCode
Method: GetType

猜你喜欢

转载自blog.csdn.net/qq_34536551/article/details/84099078
今日推荐