news 2026/3/18 11:34:16

C# GetType的常规用法汇总

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C# GetType的常规用法汇总

GetType()是 C# 中继承自Object的核心方法(返回实例的System.Type对象),看似简单,却能在反射、资源加载、通用逻辑、类型判断等场景发挥关键作用,以下是它的高频 “妙用” 场景,结合实际代码示例说明:

一、场景 1:动态加载嵌入资源(通用嵌入资源加载工具)

/// <summary> /// 通用方法:加载当前类所在命名空间下的嵌入资源 /// </summary> /// <param name="resourceName">资源文件名(如 "config.json")</param> /// <returns>资源流</returns> public Stream LoadEmbeddedResource(string resourceName) { // GetType() 动态获取当前类的命名空间,拼接资源路径 string fullResourceName = $"{GetType().Namespace}.{resourceName}"; return GetType().Assembly.GetManifestResourceStream(fullResourceName); } // 调用(无需关心命名空间,直接用) // 加载同命名空间下的 config.json using (var stream = LoadEmbeddedResource("config.json")) using (var reader = new StreamReader(stream)) { string config = reader.ReadToEnd(); }

优势:重命名命名空间 / 移动文件时,代码无需修改,自动适配。

二、场景 2:反射动态创建实例(通用工厂模式)

/// <summary> /// 通用方法:创建任意类型的实例(需无参构造函数) /// </summary> /// <typeparam name="T">基类/接口</typeparam> /// <param name="instance">示例实例(用于获取目标类型)</param> /// <returns>新实例</returns> public T CreateInstance<T>(T instance) { // GetType() 获取实例的具体类型(而非泛型 T) Type targetType = instance.GetType(); // 动态创建实例(替代硬编码 new XXX()) return (T)Activator.CreateInstance(targetType); } // 调用示例 var editTextTool = new ToolEditText(); // 动态创建 ToolEditText 实例(无需写死类型) var newTool = CreateInstance(editTextTool);

适用场景:插件化开发、配置化创建对象(如从配置文件读取类型名,结合Type.GetType()+ 反射创建)。

三、场景 3:精准的类型判断(避免 “父类 / 子类” 判断陷阱)

public class DrawTool { } // 基类 public class ToolEditText : DrawTool { } // 子类 // 测试代码 DrawTool tool1 = new DrawTool(); DrawTool tool2 = new ToolEditText(); // is 关键字:判断是否兼容(tool2 是 ToolEditText,也是 DrawTool) Console.WriteLine(tool2 is DrawTool); // true Console.WriteLine(tool2 is ToolEditText); // true // GetType():精准判断实际类型 Console.WriteLine(tool1.GetType() == typeof(DrawTool)); // true Console.WriteLine(tool2.GetType() == typeof(DrawTool)); // false(实际是 ToolEditText) Console.WriteLine(tool2.GetType() == typeof(ToolEditText)); // true

妙用场景:绘图工具中,判断用户当前选中的是 “文本工具” 还是 “矩形工具”,避免误判。

五、场景 5:动态调用类型专属方法(反射 + GetType ())

public class ToolEditText : DrawTool { public void InitEditTextTool() { Console.WriteLine("文本工具初始化"); } } public class ToolRectangle : DrawTool { public void InitRectangleTool() { Console.WriteLine("矩形工具初始化"); } } /// <summary> /// 通用初始化方法:动态调用各工具的专属初始化方法 /// </summary> /// <param name="tool">任意绘图工具</param> public void InitTool(DrawTool tool) { Type toolType = tool.GetType(); // 查找以 "Init" 开头的初始化方法 var initMethod = toolType.GetMethod($"Init{toolType.Name}"); if (initMethod != null) { initMethod.Invoke(tool, null); // 动态调用 } } // 调用 InitTool(new ToolEditText()); // 输出:文本工具初始化 InitTool(new ToolRectangle()); // 输出:矩形工具初始化

结合GetType()和反射,可动态调用实例的专属方法,无需提前知道类型

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/16 6:56:02

量子计算挑战赛寻求汽车行业技术突破

某汽车集团与某云中心正在征集提案&#xff0c;作为“某汽车集团量子计算挑战赛”的一部分[citation:5]。该挑战赛面向全球工业界和学术界的研究人员开放&#xff0c;提交截止日期为2021年9月24日[citation:5]。 挑战赛的背景与目标 量子技术的潜在应用和前景是巨大的&#xff…

作者头像 李华
网站建设 2026/3/18 7:36:27

Kotaemon支持SPIFFE身份框架吗?零信任架构适配

Kotaemon支持SPIFFE身份框架吗&#xff1f;零信任架构适配 在企业级智能对话系统日益复杂的今天&#xff0c;一个看似简单的问题背后可能隐藏着深刻的安全挑战&#xff1a;当用户通过语音助手查询订单状态时&#xff0c;这个请求究竟经历了多少层验证&#xff1f;是谁真正发起…

作者头像 李华
网站建设 2026/3/17 16:49:18

Kotaemon能否提取科研趋势?文献计量学分析初探

Kotaemon能否提取科研趋势&#xff1f;文献计量学分析初探 在人工智能驱动科研范式变革的今天&#xff0c;研究者面对的不再是“信息不足”&#xff0c;而是“信息过载”。每年数以万计的新论文涌现&#xff0c;仅靠人工阅读和综述已难以捕捉学科发展的完整脉络。如何从海量文献…

作者头像 李华
网站建设 2026/3/13 23:19:31

Kotaemon日志追踪与调试技巧:快速定位问答链路问题

Kotaemon日志追踪与调试技巧&#xff1a;快速定位问答链路问题 在智能客服、企业知识助手等高可靠性场景中&#xff0c;一个看似简单的“用户提问—系统回答”过程背后&#xff0c;往往隐藏着复杂的多阶段处理流程。当答案出错、响应延迟或偶发崩溃时&#xff0c;开发团队最头疼…

作者头像 李华
网站建设 2026/3/15 0:45:20

医疗器械厂商需要CRM吗?医疗CRM的必要性及主流推荐

为何医疗器械厂商需要CRM&#xff1f;与快消品等行业不同&#xff0c;医疗器械行业的销售与服务链条长、客户决策复杂、合规要求极高。专业的CRM系统能系统地解决以下核心痛点&#xff1a;解决客户信息分散&#xff1a;将医院、科室、专家、经销商等各方信息集中管理&#xff0…

作者头像 李华
网站建设 2026/3/12 13:32:25

32、实用编程工具:拼写检查器与索引生成器详解

实用编程工具:拼写检查器与索引生成器详解 在编程和文档处理的领域中,有两个非常实用的工具值得我们深入探讨,它们分别是拼写检查器 spellcheck.awk 和索引生成器 masterindex 。这两个工具在不同的场景下都能发挥巨大的作用,帮助我们提高工作效率和文档质量。 拼写检…

作者头像 李华