一篇文章搞懂C# Type 类

在 C# 中,Type 类是反射(Reflection)机制的核心部分。反射使你能够在运行时获取类型的信息,并对这些类型进行操作。本文将详细介绍 Type 类及其常用方法和用法。通过这篇教程,你将学习如何获取类型的元数据、调用方法、创建实例等操作。

什么是 Type 类?

Type 类属于 System 命名空间,是 C# 反射机制的核心。它提供了用于获取类型信息的属性和方法,比如类的名称、命名空间、方法、属性、字段等。通过 Type 类,你可以动态地操作类型,这在需要处理动态类型或者插件系统时特别有用。

获取 Type 对象

在使用 Type 类之前,首先需要获取 Type 对象。获取 Type 对象的方式有多种,为了方便讲解,我们先创建一个MyClass类。

public class MyClass
{
    public int MyProperty { get; set; }

    public void MyMethod()
    {
        Console.WriteLine("MyMethod called");
    }

    public void MyMethodWithParameters(int param1, string param2)
    {
        Console.WriteLine($"MyMethodWithParameters called with param1: {param1}, param2: {param2}");
    }

    public int PublicField;//公共字段
    private string PrivateField;//私有字段
}

使用 typeof 关键字

这是获取 Type 对象的最常见方式之一,通过关键字typeof类名获取类型

Type type = typeof(MyClass);

使用 GetType 方法

如果你已经有一个对象实例,可以通过该对象的 GetType 方法获取 Type 对象:

MyClass obj = new MyClass();
Type type = obj.GetType();

使用 Type.GetType 方法

你还可以通过类型的完全限定名(包含命名空间和程序集名称)来获取 Type 对象:

Type type = Type.GetType("Namespace.MyClass, AssemblyName");

获取类型信息

一旦获取了 Type 对象,就可以使用它来获取类型的各种信息。

获取类型的名称

你可以使用 Name 属性获取类型的名称:

string typeName = type.Name;
Console.WriteLine("类型名称:" + typeName);

获取类型的命名空间

使用 Namespace 属性可以获取类型的命名空间:

string namespaceName = type.Namespace;
Console.WriteLine("命名空间:" + namespaceName);

获取类型的程序集

通过 Assembly 属性可以获取类型所在的程序集:

Assembly assembly = type.Assembly;
Console.WriteLine("程序集:" + assembly.FullName);

获取类型的成员

通过 Type 类,你可以获取类型的各种成员信息,比如属性、方法、字段等。

获取类型的所有属性

使用 GetProperties 方法可以获取类型的所有属性:

PropertyInfo[] properties = type.GetProperties();
Console.WriteLine("属性列表:");
foreach (var property in properties)
{
    Console.WriteLine(property.Name);
}

获取类型的所有方法

使用 GetMethods 方法可以获取类型的所有方法:

MethodInfo[] methods = type.GetMethods();
Console.WriteLine("方法列表:");
foreach (var method in methods)
{
    Console.WriteLine(method.Name);
}

获取类型的所有字段

使用 GetFields 方法可以获取类型的所有字段:

FieldInfo[] fields = type.GetFields();
Console.WriteLine("字段列表:");
foreach (var field in fields)  //只能获取公有字段
{
    Console.WriteLine(field.Name);
}

//获取所有字段,包括私有字段
FieldInfo[] fields2 = type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
Console.WriteLine("字段列表:");
foreach (var field in fields2)
{
    Console.WriteLine(field.Name);
}

反射调用方法

反射不仅可以获取类型的信息,还可以动态调用类型的方法。以下是一些常见的反射调用方法的示例:

调用无参数方法

首先,获取方法的 MethodInfo 对象,然后使用 Invoke 方法调用它:

MethodInfo method = type.GetMethod("MyMethod");
if (method != null)
{
    method.Invoke(obj, null);
}

调用带参数的方法

如果方法带有参数,需要在 Invoke 方法中传入参数数组:

MethodInfo method = type.GetMethod("MyMethodWithParameters");
if (method != null)
{
    object[] parameters = new object[] {100, "sunny" };
    method.Invoke(obj, parameters);
}

创建实例

你还可以使用反射创建类型的实例。这对于某些需要在运行时决定实例化哪个类的场景非常有用。

创建无参数构造函数的实例

使用 Activator.CreateInstance 方法可以创建类型的实例:

object instance = Activator.CreateInstance(type);

创建带参数构造函数的实例

如果构造函数需要参数,可以在 CreateInstance 方法中传入参数数组:

object[] parameters = new object[] { param1, param2 };
object instance = Activator.CreateInstance(type, parameters);

综合示例

下面是一个综合示例,展示如何使用 Type 类获取类型信息并进行反射调用:

//通过类获取类型
using System.Reflection;

Type type = typeof(MyClass);
Console.WriteLine(type);

//通过实例取类型
var instance = new MyClass();
Type type1 = instance.GetType();
Console.WriteLine(type1);

Console.WriteLine("程序集:" + type.Assembly.FullName);

//获取公有字段
FieldInfo[] fields = type.GetFields();
//获取私有字段
FieldInfo[] fields2 = type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
Console.WriteLine("字段列表:");
foreach (var field in fields2)
{
    Console.WriteLine(field.Name);
}


// 调用无参数方法
MethodInfo method1 = type.GetMethod("MyMethod");
method1.Invoke(instance, null);

// 调用参数方法
MethodInfo method = type.GetMethod("MyMethodWithParameters");
if (method != null)
{
    object[] parameters = new object[] {100, "sunny" };
    method.Invoke(instance, parameters);
}

//创建实例
object instance2 = Activator.CreateInstance(type);
Console.WriteLine(instance2);
public class MyClass
{
    public int MyProperty { get; set; }

    public void MyMethod()
    {
        Console.WriteLine("MyMethod called");
    }

    public void MyMethodWithParameters(int param1, string param2)
    {
        Console.WriteLine($"MyMethodWithParameters called with param1: {param1}, param2: {param2}");
    }

    public int PublicField;//公共字段
    private string PrivateField;//私有字段
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/765184.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探索未来远程调试新纪元——《串口网口远程调试软件》:无缝连接,高效调试

文章目录 前言一、无缝连接,突破距离限制二、高效调试,提升工作效率三、安全可靠,保护数据安全四、用户友好,简化操作流程五、软件地址六、远程调试软件 七、基本操作1、订阅主题2、连接3、串口调试4、网口调试 八、软件地址结束语…

【问题记录】如何在xftp上查看隐藏文件。

显示隐藏的文件夹 用xftp连接到服务器后,发现有些隐藏的文件夹并未显示出来,通过以下配置,即可使隐藏的文件夹给显示出来。 1.点击菜单栏的"小齿轮"按钮: 2.勾选显示隐藏的文件夹: 3.点击确定即可。

MES系统如何帮助企业提高生产效率

万界星空科技推出的制造执行MES系统,通过一系列先进的技术手段和管理理念,显著提高了制造业工厂的生产效率。以下是MES系统帮助提高生产效率的详细分析: 一、实时监控与快速响应 实时监控生产状态:MES系统能够实时采集生产线上的…

java 代码块

Java中的代码块主要有三种类型:普通代码块、静态代码块、构造代码块。它们的用途和执行时机各不相同。 普通代码块:在方法内部定义,使用一对大括号{}包围的代码片段。它的作用域限定在大括号内,每当程序执行到该代码块时就会执行其…

SpringMVC的基本使用

SpringMVC简介 SpringMVC是Spring提供的一套建立在Servlet基础上,基于MVC模式的web解决方案 SpringMVC核心组件 DispatcherServlet:前置控制器,来自客户端的所有请求都经由DispatcherServlet进行处理和分发Handler:处理器&…

linux中如何启动python虚拟环境

找到python虚拟环境所在目录 执行下面的命令即可 source auth_python/bin/activate

linux 下neo4j的安装

一、neo4j简介 Neo4j 是一个高性能的 NoSQL 图形数据库,它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j 也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。 neo4j与jdk版本对应 neo4j的版本需要与jdk版本相适配,否则容易出现安装失…

数据库原理之数据库基本概念

目录 前言 基本概念 数据库完整性 前言 今天我们来看看数据库的基本概念,帮助大家对数据库有一点点最基本的了解 基本概念 4个基本概念 数据data:描述事物的符号,数据库中存储的基本对象。 数据库Database:长期存储在计算机…

CentOS 7 搭建rsyslog日志服务器

CentOS 7 搭建rsyslog日志服务器 前言一、IP地址及主机名称规划1.修改主机名 二、配置rsyslog日志服务器1.安装rsyslog服务2.编辑/etc/rsyslog.conf 文件3.启动并启用rsyslog服务4.验证端口是否侦听 三、在rsyslog日志服务器上配置firewalld防火墙四、配置rsyslog日志客户端1.编…

25考研:今年初试时间比去年更早了?

过去5年考研初试时间安排如下: 24考研:2023年12月23-24日(倒数第二个周末) 23考研:2022年12月24-25日(倒数第二个周末) 22考研:2021年12月25-26日(最后一个周末&#xf…

opencascade AIS_InteractiveContext源码学习7 debug visualization

AIS_InteractiveContext 前言 交互上下文(Interactive Context)允许您在一个或多个视图器中管理交互对象的图形行为和选择。类方法使这一操作非常透明。需要记住的是,对于已经被交互上下文识别的交互对象,必须使用上下文方法进行…

数据加密解密和哈希的解析

[S1301]数据的加解密 对提供的原始数据(字符串或者二进制数组)进行加密是数据保护框架体提供的基本功能,接下来我们利用一个简单的控制台程序来演示一下加解密如何实现。数据的加解密均由IDataProtector对象来完成,而该对象由IDa…

FormLayout布局和FormItem对比

FormLayout布局和FormItem对比 FormLayout布局 package mainimport ("fyne.io/fyne/v2""fyne.io/fyne/v2/app""fyne.io/fyne/v2/container""fyne.io/fyne/v2/layout""fyne.io/fyne/v2/widget" )func main() {myApp : app.…

vulnhub靶场ai-web 2.0

1 信息收集 1.1 主机发现 arp-scan -l 主机地址为192.168.1.4 1.2 服务端口扫描 nmap -sS -sV -A -T5 -p- 192.168.1.4 开放22,80端口 2 访问服务 2.1 80端口访问 http://192.168.1.4:80/ 先尝试admin等其他常见用户名登录无果 然后点击signup发现这是一个注…

【Rust入门教程】hello world程序

文章目录 前言Hello World程序运行总结 前言 对于学习任何一种新的编程语言,我们都会从编写一个简单的Hello World程序开始。这是一个传统,也是一个开始。在这篇文章中,我们将一起学习如何在Rust中编写你的第一个程序:Hello Worl…

重磅发布|WAIC 2024最新活动日程安排完整发布!

WAIC 2024 将于 7 月在上海世博中心和世博展览馆举行,论坛时间为 7 月 4 日至 6 日,展览时间为 7 月 4 日至 7 日。会议涵盖 AI 伦理治理、大模型、具身智能、投融资、教育人才等重点话题,体现 AI 向善等价值导向,9 位大奖得主和 …

免交互简单操作

免交互 交互:我们发出指令控制程序的运行,程序在接收到指令后按照指令的效果作出对应的反应 免交互:间接的,通过第三方的方式把指令传给程序,不用直接下达指令 Here Document免交互 这是命令行格式,也可…

CVE-2024-0603 漏洞复现

CVE-2024-0603 源码:https://gitee.com/dazensun/zhicms 开题: CVE-2024-0603描述:ZhiCms up to 4.0版本的文件app/plug/controller/giftcontroller.php中存在一处未知漏洞。攻击者可以通过篡改参数mylike触发反序列化,从而远程…

Dockerhub无法拉取镜像配置阿里镜像加速器

打开阿里镜像加速地址: https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 根据平台类型按照对应方式进行配置:Dokcer Desktop是在右上角点开配置 找到Docker Engine 进行设置JSON结构: 记得要重启Docker服务才会生效&#xff01…

无偏归一化自适应心电ECG信号降噪方法(MATLAB)

心电信号作为一种生物信号,含有大量的临床应用价值的信息,在现代生命医学研究中占有重要的地位。但心电信号低频、低幅值的特点,使其在采集和传输的过程中经常受到噪声的干扰,使心电波形严重失真,从而影响后续的病情分…