System.Type类它实际上是一个抽象类

C#中可以通过Type类访问任意数据类型的信息

一般获取数据类型的Type引用有以下几种方式:

  • 使用typeof运算符:Type type1 = typeof(int);  注:这个运算符的参数是类型的名称(不能放在引号中)。
  • 使用GetType()方法,所有的类都会从System.Object继承这个方法。如下实例
 int i = 6;
Type type1 = i.GetType();

注:只能用变量直接调用GetType()方法,而不是把类型的名称作为其参数。但是注意,返回的Type对象仍然只与该数据类型相关:它不包含与该类型的实例相关的任何信息。如果引用了一个对象,但是不能确保对象实际上是那个类的实例,GetType方法就很有用。

  • 通过调用Type类的静态方法GetType():
 Type type1 = Type.GetType("System.Int32");

1.Type的属性

  • Name:是获取数据类型名称(如:使用的是类就获取类的名称、使用的是int就获取“Int32”),即只能获取类的名称。(返回值)
  • FullName:获取数据类型的完全限定名(包括名称空间名、即:命名空间名称),即同时获取类的命名空间+类名的完全限定名称。(返回值)
  • Namespace:只能获取数据类的命名空间名称。(返回值)
  • BaseType:获取该Type的直接基本类型(返回对应的Type引用)
  • UnderlyingSystemType:该Type中映射到的类型。这个只能在完整框架中使用(返回对应的Type引用)
  • 示例代码如下:
  static void Main(string[] args)
{
Console.WriteLine("***********************Type属性使用***********************");
int i = 42;
Type type = i.GetType();
Console.WriteLine(type);
Console.WriteLine("***********************Type属性返回的是对应的值***********************");
string type1 = i.GetType().Name;
Console.WriteLine("类型名称:" + type1);
string type2 = i.GetType().FullName;
Console.WriteLine("类型名称的完全限定名(包括命名空间):" + type2);
string type3 = i.GetType().Namespace;
Console.WriteLine("在其中使用数据类型的名称空间名:" + type3);
Console.WriteLine("***********************Type属性返回的是对应的Type引用***********************");
Type tp1 = i.GetType().BaseType;
Console.WriteLine(tp1);
Type tp2 = i.GetType().UnderlyingSystemType;
Console.WriteLine(tp2);
Console.WriteLine("***********************Type属性返回值为布尔的***********************");
Type intType = typeof(int);
Console.WriteLine(intType.IsAbstract);// 是否为抽象
Console.WriteLine(intType.IsArray);//是否为数组
Console.WriteLine(intType.IsClass);//是否为类或委托
Console.WriteLine(intType.IsEnum);//是否为枚举
Console.WriteLine(intType.IsInterface);//是否为接口
Console.WriteLine(intType.IsPointer);//是否为指针
Console.WriteLine(intType.IsPrimitive);//是否为基元素类型
Console.WriteLine(intType.IsPublic);//是否声明为公共的
Console.WriteLine(intType.IsSealed);//是否声明为密封的
Console.WriteLine(intType.IsValueType);//是否为值类型 Console.Read();
}

  2.方法

在使用Type的方法时必须先引用“using System.Reflection;”

System.Type的大多数方法都用于获取对应数据的成员信息:构造函数、属性、方法和事件:

示例中使用的类:

    class Student
{
public int Id { get; set; }
public string Name { get; set; }
public int Age;
public DateTime Birthday;
private string Address;
public Student()
{ }
public Student(int id)
{
this.Id = id;
}
public Student(string name)
{
this.Name = name;
}
public Student(int id, string name)
{
this.Id = id;
this.Name = name;
}
public void Motion()
{
Console.WriteLine($"{this.Name}在运动");
}
public void Motion(int id)
{
Console.WriteLine("调用有一个参数的方法");
}
public void Motions(int id)
{
Console.WriteLine("调用有一个参数的方法");
}
}
  • 获取类型中的构造函数:GetConstructor()、GetConstructors()
static void Main(string[] args)
{
Type type = typeof(Student);
Console.WriteLine("***********************获取单个构造函数开始*************************");
Console.WriteLine("***********************获取没有参数的构造函数格式***********************");
ConstructorInfo info = type.GetConstructor(new Type[0]);
Console.WriteLine(info);
ConstructorInfo info1 = type.GetConstructor(Type.EmptyTypes);
Console.WriteLine(info1);
ConstructorInfo info2 = type.GetConstructor(new Type[] { });
Console.WriteLine(info2);
Console.WriteLine("***********************获取有参数的构造函数格式***********************");
ConstructorInfo info3 = type.GetConstructor(new Type[] { typeof(int) });
Console.WriteLine(info3);
ConstructorInfo info4 = type.GetConstructor(new Type[1] { typeof(string) });
Console.WriteLine(info4);
ConstructorInfo info5= type.GetConstructor(new Type[2] { typeof(string),typeof(int) });//当传入的参数类型和构造函数的数据类型不一致不会报错
Console.WriteLine(info5);
ConstructorInfo info6 = type.GetConstructor(new Type[] { typeof(int), typeof(string) });//参数类型必须一致
Console.WriteLine(info6);
Console.WriteLine("***********************获取单个构造函数结束***********************");
Console.WriteLine();
Console.WriteLine("***********************获取所有的构造函数集合***********************");
foreach (var con in type.GetConstructors())
{
Console.WriteLine(con);
}
Console.WriteLine("***********************获取根据传入的参数获取指定的构造函数集合***********************");
foreach (var item in type.GetConstructors(BindingFlags.Instance | BindingFlags.Public))
{
Console.WriteLine(item);
}
Console.Read();
}
  • 获取类型中的事件:GetEvent()、GetEvents()
        static void Main(string[] args)
{
Console.WriteLine("***********************获取窗体中的按钮事件*************************");
Type type = typeof(System.Windows.Forms.Button);
Console.WriteLine("***********************获取窗体中的Click按钮事件*************************");
EventInfo gs = type.GetEvent("Click");
Console.WriteLine(gs);
Console.WriteLine();
Console.WriteLine("***********************获取窗体中所有的按钮事件集合*************************");
foreach (var btn in type.GetEvents())
{
Console.WriteLine(btn);
}
Console.WriteLine("***********************获取窗体中的指定条件的按钮事件集合*************************");
foreach (var item in type.GetEvents(BindingFlags.Instance | BindingFlags.Public))
{
Console.WriteLine(item);
}
Console.ReadKey();
}
  • 获取类型中的字段:GetField()、GetFields()
        static void Main(string[] args)
{
Console.WriteLine("***********************获取类型中的字段*************************");
Type type = new Student().GetType();
Console.WriteLine("***********************获取类型中指定的字段*************************");
FieldInfo info = type.GetField("Age");
Console.WriteLine(info);
Console.WriteLine();
Console.WriteLine("***********************获取类型中的字段集合*************************");
foreach (var item in type.GetFields())
{
Console.WriteLine(item);
}
Console.ReadKey();
}
  • 获取类型中方法:GetMethod()、GetMethods()
 static void Main(string[] args)
{
Type type = new Student().GetType();
Console.WriteLine("***********************获取类型中指定的方法*************************");
MethodInfo info = type.GetMethod("Motion", Type.EmptyTypes);
Console.WriteLine(info);
MethodInfo info1 = type.GetMethod("Motion", new Type[0]);
Console.WriteLine(info1);
MethodInfo info2 = type.GetMethod("Motion", new Type[] { });
Console.WriteLine(info2);
MethodInfo info3 = type.GetMethod("Motion", new Type[1] { typeof(int) });
Console.WriteLine(info3);
MethodInfo info4 = type.GetMethod("Motions", new Type[] { typeof(int) });
Console.WriteLine(info4);
Console.WriteLine();
Console.WriteLine("***********************获取类型中所有的方法集合*************************");
foreach (var item in type.GetMethods())
{
Console.WriteLine(item);
}
Console.ReadKey();
}
  • 获取类型中公共成员:GetMember()、GetMembers()
        static void Main(string[] args)
{
Type type = new Student().GetType();
Console.WriteLine("***********************获取类型中指定的公共成员*************************");
foreach (var item in type.GetMember("Motion"))
{
Console.WriteLine(item);
}
Console.WriteLine();
Console.WriteLine("***********************获取类型中所有的公共成员*************************");
foreach (var item in type.GetMembers())
{
Console.WriteLine(item);
}
Console.ReadKey();
}
  • 获取类型中的属性:GetProperty()、GetProperties()
        static void Main(string[] args)
{
Type type = new Student().GetType();
Console.WriteLine("***********************获取类型中指定的属性法*************************");
PropertyInfo info = type.GetProperty("Id");
Console.WriteLine(info);
Console.WriteLine("***********************获取类型中所有的属性集合*************************");
foreach (var item in type.GetProperties())
{
Console.WriteLine(item);
}
Console.ReadKey();
}

搜索

复制

C# Type类的更多相关文章

  1. 反射,System.Type类

    http://m.blog.csdn.net/blog/woddle/40623333 两个现实中的例子:1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内脏的生理情况.这是如何做到 ...

  2. C# - 系统类 - Type类

    Type类 ns:System Type类封装类型 它的实例提供一个特定类型的数据和函数成员的信息 可以使用Type类实例来调用类型的成员 一般将Type类用于反射 Type类的静态字段如下 Empt ...

  3. 反射 介绍System.Type类

    本节先介绍system.Type类,通过这个类可以访问关于任何数据类型的信息. 1. system.Type类以前把Type看作一个类,但它实际上是一个抽象的基类.只要实例化了一个Type对象,实际上 ...

  4. Python type类具体的三大分类:metaclasses,classes,instance

    Python type类视角中的对象体系需要我们不断的学习,其中我们使用的时候需要注意.下面我们就看看如何才能更好的运用Python type类.下面的文章希望大家有所收获. 在单纯的Python t ...

  5. C# 反射和Type类

    一.元数据和反射 1.1 定义 大多数程序都要处理数据,包括读.写.操作和显示数据.然而,对于某些程序来说,它们操作的不是数字.文本或图形,而是程序和程序类型本身的信息. ● 有关程序及其类型的数据被 ...

  6. 反射+type类+Assembly+特性

    什么是元数据,什么是反射: 程序是用来处理数据的,文本和特性都是数据,而我们程序本身(类的定义和BLC中的类)这些也是数据. 有关程序及其类型的数据被称为元数据(metadata),它们保存在程序的程 ...

  7. Java中Class Type 类类型是怎么回事?

    Java中三种方式可以用来表示Class Type(类的实例对象), 第一种,通过隐藏的静态成员变量class来表示:第二种,通过调用该类的对象的getClass方法:第三种,通过Class.forN ...

  8. .NET(C#):判断Type类的继承关系

    //Type类的函数 class Type bool IsInstanceOfType(object); //判断对象是否是指定类型 //类型可以是父类,接口 //用法:父类.IsInstanceOf ...

  9. Type类的使用

    Type类的使用(类反射)通过类获得Type: Type t = typeof(Person)通过实例对象获得类的Type: Type t = p.GetType()获取Type的方法:MethodI ...

  10. .NET反射 Type类

    不知道大家有过这样类似的编码 ? 1 Type type=typeof(T);//T是传入的类型 这样写已经是在潜意思的使用反射了.不管你是否知道,但是这是事实. Type是一个抽象类,必须进行实例化 ...

随机推荐

  1. JavaScript:对象:对象和属性的内存结构是什么样的?

    在说变量的时候,大致画了变量的内存结构,现在来看一下对象的内存结构是什么样的,有助于我们理解传参的各种情况,只是大致的画一下内存模型,不代表实际内存情况. 我们可以用一段代码,来判断一下,是不是这样的 ...

  2. 沁恒微(WCH)CH395/392配置使用,代码指南 网路接口芯片 CH395 CH392

    CH395/CH392相关资料可以从官网下载具体连接可以看博客:WCH以太网相关芯片资料总结 里面是WCH官网相关信息的链接. 也可以去Gitee上下载:Gitee链接. STM32控制CH395的例 ...

  3. 如何使用 Blackbox Exporter 监控 URL?

    前言 监控域名和 URL 是可观察性的一个重要方面,主要用于诊断可用性问题.接下来会详细介绍如何使用 Blackbox Exporter 和 Prometheus 在 Kubernetes 中实现 U ...

  4. C++初探索

    C++初探索 前言 C++ 和 C 的区别主要在8个方面: 输入和输出 引用 inline函数 函数默认值 函数重载 模板函数 new 和 delete namespace 我仅对印象不深的地方做了总 ...

  5. ac自动姬

    字符串 ac自动姬 前言 省选临近,不能再颓了! 说着开始研究起moonlight串流.真香 本期博客之所以在csdn上发了一份,因为没有图床!如果有图床我一定会自力更生的! 好像和字符串没有毛关系 ...

  6. 疯狂吐槽 MAUI 以及 MAUI 入坑知识点

    目录 窗口 窗口管理 如何限制一次只能打开一个程序 MAUI 程序安装模式 为 MAUI Blazor 设置语言 坑 ① 坑 ② 坑 ③ 配置 MAUI 项目使用管理员权限启动 问题背景 定制编译过程 ...

  7. Java基础学习笔记-类的静态属性和静态方法--待继续补充

    程序运行时的内存占用 代码区(code area) 存放代码 数据区(data area) 存放全局数据.静态数据 堆区(heap area) 存放动态申请的数据 栈区(stack area) 存放局 ...

  8. 第一个C程序

    写C代码 创建工作区 创建工程 创建文件(.c源文件..h头文件) main函数是程序执行的入口,有且只有一个 函数printf(print function打印函数)[库函数-C语言本身提供给我们使 ...

  9. 记OPNsense防火墙的安装过程 - 安全

    前些天在网上看到防火墙软件OPNsense,对其有了兴趣,以前写过一个其前面的一个软件M0n0wall( 关于m0n0wall的安装及配置 ),当时也是非常有名的防火墙,现在有了OPNsense,这个 ...

  10. 鸿蒙系统应用开发之基于API6的蓝牙开发

    写在前面 由题意得,我今天讲的是基于鸿蒙系统的兼容JS的类Web开发范式的软件应用开发之蓝牙开发,它是基于API6的,至于为什么是基于API6,请你花几分钟看一下我之前写的这个系列教程的第四篇&quo ...