C# 获取Type对象的方式

总目录


前言

在 C# 中,获取 Type 对象的三种主要方式如下:


一、使用 typeof 运算符

typeof 是 C# 的内置运算符,用于在 编译时 获取指定类型的 Type 对象。它不需要对象实例,直接通过类型名即可获取。

1. 语法

Type type = typeof(类型名);

2. 特点

  • 编译时绑定:在编译时确定类型,类型名称必须是已知的(如 intstring、自定义类型等)。
  • 无法获取运行时类型:无法通过变量或对象实例获取动态类型。
  • 适用场景:已知类型名称且无需运行时多态性时使用。

3. 示例

public class User { }public interface IWorker { }internal class Program
{static void Main(string[] args){// 获取内置类型的 Type 对象Type type1 = typeof(string);Console.WriteLine(type1.Name); // 输出:Stringtype1 = typeof(Int32);Console.WriteLine(type1.Name); // 输出:Int32// 获取自定义类型的 Type 对象Type type = typeof(User);Console.WriteLine(type.Name); // 输出:Usertype = typeof(IWorker);Console.WriteLine(type.Name); // 输出:IWorker   }
}

4. 注意事项

  • 参数必须是类型名称:不能传入变量或对象实例。例如:
    int num = 42;
    Type type = typeof(num); // 错误!typeof 的参数必须是类型名,而非变量名
    
  • 泛型支持:可以直接获取泛型类型:
    Type listType = typeof(List<int>); // 获取 List<int> 的 Type 对象
    

二、对象的 GetType() 方法

GetType()System.Object 类的虚方法,所有对象都继承自它。它返回对象在 运行时 的实际类型。

1. 语法

Type type = 对象实例.GetType();

2. 特点

  • 运行时绑定:返回对象的实际类型,支持多态。例如,基类引用指向派生类实例时,GetType() 会返回派生类的 Type
  • 需要对象实例:必须通过对象实例调用。
  • 适用场景:需要动态获取对象的运行时类型时使用。

3. 示例

using System;public class User { }class Program
{static void Main(){// 自定义类型 示例User user = new User();Type typeFromInstance = user.GetType();Console.WriteLine(typeFromInstance.Name); // 输出:User// 内置类型 示例string str = "hello";Type typeFromInstance2 = str.GetType();Console.WriteLine(typeFromInstance2.Name); // 输出:Stringint num = 32;Type typeFromInstance3 = num.GetType();Console.WriteLine(typeFromInstance3.Name); // 输出:Int32}
}

4. 注意事项

  • 多态性:返回对象的实际运行时类型,而非声明类型。
  • 空对象:如果对象为 null,调用 GetType() 会抛出 NullReferenceException

三、通过 Assembly.GetType()Type.GetType()

通过程序集(Assembly)的 GetType 方法或 Type.GetType 静态方法,根据 字符串类型的全名 动态获取 Type 对象。这种方式在运行时动态加载类型时非常有用。

1. 语法

// 通过程序集获取
Assembly assembly = Assembly.GetExecutingAssembly();
Type type = assembly.GetType("命名空间.类型名称");// 通过 Type.GetType 静态方法
Type type = Type.GetType("命名空间.类型名称, 程序集名称");

2. 特点

  • 运行时动态获取:通过字符串名称查找类型,支持延迟绑定。
  • 需要全名:类型名称必须包含完整的命名空间和程序集信息(如 "System.String""MyNamespace.MyClass, MyAssembly")。
  • 适用场景:在插件系统、配置加载或反射序列化等场景中动态加载类型。

3. 示例

// 示例1:获取当前程序集中的类型
Assembly currentAssembly = Assembly.GetExecutingAssembly();
// 需要完全限定名(命名空间.类型名)
Type personType = currentAssembly.GetType("TestNamespace.Person"); 
// 示例2:使用 Type.GetType(需指定程序集名称)
Type stringType = Type.GetType("System.String"); // 成功
Type unknownType = Type.GetType("NonExistentType"); // 返回 null

4. 注意事项

  • 完全限定名:必须提供完整的命名空间和程序集名称(如 "MyClass, MyAssembly")。
  • 程序集加载:如果类型不在当前程序集中,需先加载对应的程序集。
  • 返回值为 null:如果类型不存在或名称不正确,返回 null,需处理空值。

5. Type.GetTypeAssemblyQualifiedName

  • AssemblyQualifiedName 是类型的程序集限定名,适用于通过反射加载类型。

  • 通过使用Type.GetType 获取指定名称的类型对象的时候,需要传入 AssemblyQualifiedName 完成类型的加载。

  • 关于Type.GetTypeAssemblyQualifiedName 配合使用的规则如下:

    • 名称A:类型的程序集限定名=类型的完全限定名+程序集的名称
      • 如:MyNamespace.MyClass, MyLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abcdef1234567890
    • 名称B:类型的程序集限定名=类型的完全限定名+程序集的名称
      • 如:MyNamespace.MyClass, MyLibrary
    • 名称C:类型的完全限定名
      • 如:MyNamespace.MyClass
加载类型时
是否要求
程序集强名称
使用 名称A
是否位于
同一程序集内
使用 名称B/C
使用 名称B

注:是否位于同一程序集,表示的是:需要动态加载的类型 与 当前负责加载的对象 是否位于同一程序集的时候,如程序集A 中有类型AClass,程序集B中需要动态加载程序集A中的AClass,这种情况属于不在同一程序集内。

四、 三种方式的对比总结

方法是否需要实例运行时/编译时多态性支持适用场景
typeof编译时已知类型且无需动态类型
GetType()运行时需要对象实际运行时类型
Assembly.GetType()

Type.GetType()
运行时动态加载类型(如插件系统)

五、实际应用示例

场景1:类型检查

object obj = "Hello";
if (obj.GetType() == typeof(string)) // 结合 GetType() 和 typeof()
{Console.WriteLine("对象是字符串类型");
}

场景2:动态创建对象

string typeName = "System.String";
Type type = Type.GetType(typeName);
if (type != null)
{object instance = Activator.CreateInstance(type); // 创建字符串实例
}

场景3:反射调用方法

Type type = typeof(string);
MethodInfo method = type.GetMethod("Substring", new Type[] { typeof(int) });
string result = (string)method.Invoke("Hello", new object[] { 2 }); // 输出 "llo"

注意事项

  1. 性能:反射操作(如 GetType()Assembly.GetType)在频繁使用时可能影响性能,建议缓存 Type 对象。
  2. 安全性:动态获取类型时需验证输入,防止注入攻击(如 Type.GetType 的参数可能被恶意构造)。
  3. 命名空间与程序集:使用 Assembly.GetTypeType.GetType 时,确保类型名称的完全限定名正确。

通过合理选择这三种方式,可以灵活应对 C# 中类型反射的各类需求。


结语

回到目录页:C#/.NET 知识汇总
希望以上内容可以帮助到大家,如文中有不对之处,还请批评指正。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Dynamics 365 启用用户安全角色变更的审核功能

D365自身的审核功能这里就不说了&#xff0c;是一个很古老的功能&#xff0c;用过D365的人应该都知道&#xff0c;今天要说的是用户安全角色变更的审核记录。 很多人用系统的审核功能&#xff0c;更多的是用来追踪用户的登录记录&#xff0c;或者记录的修改记录。 而实际的项目…

spring boot3 kafka集群搭建到使用

首先自行安装docker&#xff0c;通过docker容器安装kafka CentOS 系统 docker安装地址 1.pom.xml和application.properties或者application.yml文件配置 <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</arti…

docker的anythingllm和open-webui压缩包分享(国内镜像拉取,百度云压缩包分享)

文章目录 前言第一部分&#xff1a;镜像获取&#x1f680; 方式一&#xff1a;切换国内下载镜像✅1. 下载anythingllm✅ 2. 下载open-webui &#x1f680;方式二&#xff1a;下载我分享的百度云✅ anythingllm压缩包百度云链接❎ open-webui压缩包 第二部分&#xff1a;下载之后…

【VBA】excel获取股票实时行情(历史数据,基金数据下载)

文章目录 0. 效果展示与获取其它相关内容&#xff1a; 1. Excel VBA 自动化与对象模型2. HTTP 请求与 API 数据获取3. JSON 数据解析与字符串处理4. 自动任务调度与实时刷新5. 错误处理与健壮性设计 0. 效果展示与获取 作品&#xff1a;https://mbd.pub/o/bread/aJaUmplq 需要…

docker的使用

时间&#xff1a;2025.3.17 一、当我们想要运行一个容器时&#xff0c;不是在containers处&#xff0c;而是需要在images处找对应容器的镜像 操作步骤&#xff1a; 1.找容器镜像 2.找到容器镜像&#xff0c;通过pull下载到当前主机中 3.下载成功后进行运行 4.运行时的容器镜像…

本地部署deepseek-r1建立向量知识库和知识库检索实践【代码】

目录 一、本地部署DS 二、建立本地知识库 1.安装python和必要的库 2.设置主目录工作区 3.编写文档解析脚本 4.构建向量数据库 三、基于DS,使用本地知识库检索 本地部署DS,其实非常简单,我写了一篇操作记录,我终于本地部署了DeepSeek-R1(图文全过程)-CSDN博客 安装…

Matlab 汽车传动系统的振动特性分析

1、内容简介 Matlab 186-汽车传动系统的振动特性分析 可以交流、咨询、答疑 2、内容说明 略 摘要&#xff1a;汽车动力传动系统是一个具有多自由度的、连续的、有阻尼系统。传动系统的振动主要有横向振动、扭转振动、纵向振动。并且汽车传动系统的扭转振动是一个非常重要的振…

【C++】树和二叉树的实现(上)

本篇博客给大家带来的是用C语言来实现数据结构树和二叉树的实现&#xff01; &#x1f41f;&#x1f41f;文章专栏&#xff1a;数据结构 &#x1f680;&#x1f680;若有问题评论区下讨论&#xff0c;我会及时回答 ❤❤欢迎大家点赞、收藏、分享&#xff01; 今日思想&#xff…

k8s环境部署

四台机器 分别是 k8s-master&#xff1a;172.25.254.100 k8s-node1&#xff1a;172.25.254.10 k8s-node2&#xff1a;172.25.254.20 docker-harbor&#xff1a;172.25.254.200 reg.timinglee.org 四台机器分别配置好网络和软件仓库 做好地址解析 scp -r /etc/hosts/ root17…

transformer bert 多头自注意力

输入的&#xff08;a1,a2,a3,a4&#xff09;是最终嵌入&#xff0c;是一个(512,768)的矩阵&#xff1b;而a1是一个token&#xff0c;尺寸是768 a1通过Wq权重矩阵&#xff0c;经过全连接变换得到查询向量q1&#xff1b;a2通过Wk权重矩阵得到键向量k2&#xff1b;q和k点乘就是值…

它,让机器人与HMI屏无缝对接

随着工业自动化向智能化发展&#xff0c;机器人与HMI屏的通信变得至关重要。本文将为您介绍一款创新的解决方案&#xff0c;它打破了通信协议的壁垒&#xff0c;实现机器人与HMI屏的无缝连接。 随着工业自动化向智能化的迈进&#xff0c;生产制造业正加速引入大量工业机器人以替…

MySQL 锁

MySQL中最常见的锁有全局锁、表锁、行锁。 全局锁 全局锁用于锁住当前库中的所有实例&#xff0c;也就是说会将所有的表都锁住。一般用于做数据库备份的时候就需要添加全局锁&#xff0c;数据库备份的时候是一个表一个表备份&#xff0c;如果没有加锁的话在备份的时候会有其他的…

win10 c++ VsCode 配置PCL open3d并显示

win10 c VsCode配置PCL open3d并显示 一、效果图二、配置步骤2.1 安装vscode2.2 pcl-open3d配置2.3 vscode中设置 三、测试代码四、注意事项及后续 一、效果图 二、配置步骤 2.1 安装vscode vscode下载链接 下载中文插件、c相关插件 2.2 pcl-open3d配置 1&#xff09;下载…

Python----计算机视觉处理(Opencv:图像颜色替换)

一、开运算 开运算就是对图像先进行腐蚀操作&#xff0c; 然后进行膨胀操作。开运算可以去除二值化图中的小的噪点&#xff0c;并分离相连的物体。 其主要目的就是消除那些小白点 在开运算组件中&#xff0c;有一个叫做kernel的参数&#xff0c;指的是核的大小&#xff0c;通常…

泰勒·斯威夫特(Taylor Swift)的音乐影响力与商业版图深度研究

泰勒斯威夫特的音乐影响力与商业版图深度研究 简介 泰勒斯威夫特&#xff08;Taylor Swift&#xff09;是当今流行音乐领域最具影响力的全球巨星之一。自少年时期出道以来&#xff0c;她在音乐风格、形象和商业战略上不断演变&#xff0c;从乡村音乐新人成长为引领流行文化的…

完全托管的DeepSeek-R1模型正式登陆Amazon Bedrock:安全部署与使用指南

文章目录 摘要一、核心优势&#xff1a;完全托管与企业级安全二、部署注意事项三、实践指南&#xff1a;从接入到调用四、支持区域与定价五、结语 摘要 DeepSeek-R1模型已在Amazon Bedrock平台正式上线&#xff0c;支持通过Bedrock Marketplace和自定义模型导入功能调用。 该模…

Matlab 汽车ABS实现模糊pid和pid控制

1、内容简介 Matlab 181-汽车ABS实现模糊pid和pid控制 可以交流、咨询、答疑 2、内容说明 略 实现汽车防抱死制动系统&#xff08;ABS&#xff09;的控制算法&#xff0c;通常涉及到传统的PID控制和模糊PID控制两种方法。下面将分别介绍这两种控制策略的基本概念以及如何在M…

Spring IOC(五个类注解)

controller、service、Repository、Component 、Configurationpackage com.java.ioc;import com.java.ioc.Controller.HelloController; import com.java.ioc.rep.UserRepository; import com.java.ioc.service.UserService; import org.springframework.boot.SpringApplicatio…

[Java实战]Spring Boot服务CPU 100%问题排查:从定位到解决

Spring Boot服务CPU 100%问题排查&#xff1a;从定位到解决 1. 引言 当Spring Boot服务出现CPU占用率100%时&#xff0c;系统性能会急剧下降&#xff0c;甚至导致服务不可用。本文将通过真实代码案例&#xff0c;详细讲解如何快速定位问题根源&#xff0c;并提供解决方案。无…

机器学习扫盲系列(2)- 深入浅出“反向传播”-1

系列文章目录 机器学习扫盲系列&#xff08;1&#xff09;- 序 机器学习扫盲系列&#xff08;2&#xff09;- 深入浅出“反向传播”-1 文章目录 前言一、神经网络的本质二、线性问题解析解的不可行性梯度下降与随机梯度下降链式法则 三、非线性问题激活函数 前言 反向传播(Ba…