C# GetType的常规用法汇总

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

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

cs 复制代码
/// <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:反射动态创建实例(通用工厂模式)

cs 复制代码
/// <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:精准的类型判断(避免 "父类 / 子类" 判断陷阱)

cs 复制代码
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 ())

cs 复制代码
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() 和反射,可动态调用实例的专属方法,无需提前知道类型

相关推荐
名字还没想好☜9 分钟前
Java NIO ByteBuffer 实战:flip/clear/compact 三个绕晕人的方法与 position/limit 心智模型
java·开发语言·后端·spring·nio
小溪学编程36 分钟前
AQS 原理详解:从 CLH 队列到 ReentrantLock 的实现
java·开发语言
持敬chijing38 分钟前
Web前后端开发-JavaScript 入门教程
开发语言·前端·javascript
2601_966949651 小时前
从轮询到策略消费:量化系统如何高效处理五档盘口数据
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
我命由我123451 小时前
人脸识别 - 去重时间窗口
java·开发语言·python·学习·java-ee·学习方法·python3.11
落魄大学生之流水线上谋生计2 小时前
Java并发核心机制详解:线程池、CAS、AQS、锁升级
java·开发语言·数据库
hahaha60162 小时前
HLS高层次综合设计技巧--数组
开发语言·嵌入式硬件·算法·fpga开发
佳児素花痴╮2 小时前
Qt速通2
开发语言·qt
“AI国潮设计-小江”2 小时前
【Python/SDXL实战】潮汕国潮IP视觉落地:普宁英歌舞猫IP & 创意甜品设计(附ComfyUI工作流与商业授权说明)
开发语言·人工智能·python·prompt·aigc
529宝宝起名网3 小时前
用 Python 分析汉字字源与起名用字的关联规律:从六书结构到文化寓意的起名偏好洞察
开发语言·python