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

搜索

复制

最新文章

  1. C# 动态调用DLL库
  2. 自动保存u盘里的文件
  3. <!DOCTYPE html PUBLIC 导致js代码不可用
  4. 网站迁移时候,发现<head>内容都到body里了
  5. esriSRGeoCSType Constants
  6. JS对象类型的确定
  7. 1170: 非常男女(XCOJ 前缀和)
  8. 墙上时钟时间 ,用户cpu时间 ,系统cpu时间
  9. UIImage 和 UIImageView区别
  10. windows下cmd常用
  11. Java杂记9—NIO
  12. Python3定时短信获得天气
  13. Chapter 4 : Control Structures 1 : Selection
  14. tab切换 原生js
  15. 国内写的比较好的markdown教程
  16. 唯美PS转手绘之SAI篇_百度经验
  17. How to Install Apache Tomcat 8.5 on CentOS 7.3
  18. 在线建立或重做mysql主从复制架构方法(传统模式和GTID模式)【转】
  19. Python2 简明教程
  20. 链表排序 Sort List

热门文章

  1. 9、手写一个starter
  2. 2022年7月10 第四组 周鹏 CSS的基本认识
  3. CH579-Lwip-2.12移植
  4. 体验一个前端视图层的mvvm的框架Knockoutjs(双向绑定,模板..)..解放您的双手,不再处理那么多的dom操作..快速实现视图层数据与UI的交互处理
  5. Gvim基础操作(正则表达式)-02
  6. ASP.NET 6.0 Core 迁移 ASP.NET Core 7.0
  7. (21)go-micro微服务logstash使用
  8. djiango路由匹配、djiango路由层、反向解析、有名无名反向解析
  9. wsl2和ArchLinux的安装
  10. java 进阶P-2.3+P-2.4