ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

typeof()

typeof()

C# 中的 typeof() 是啥?一句话讲清楚:

typeof() 就是“问编译器:这个类型长啥样?”

它不是运行时去查对象,而是编译时就确定你写的那个“类名、接口名、结构名”到底是谁,然后返回一个叫 Type 的对象,这个对象里装满了这个类型的“身份证信息”。


举个接地气的例子:

你写:

Type t = typeof(string);

翻译成人话就是:

“编译器大哥,帮我查一下 string 这个类型的信息,打包成一个‘类型身份证’给我,我叫它 t。”

这个 t 里有什么?比如:

  • 类型名字:"System.String"
  • 它是不是类?是不是数组?有没有构造函数?
  • 有哪些方法、属性、字段?
  • 它继承自谁?实现了哪些接口?

typeof() 有啥用?实际场景举例:

1️⃣ 反射(Reflection)—— 动态操作类型

你想在程序运行时,根据类型名动态创建对象、调用方法?

Type type = typeof(MyClass);
object obj = Activator.CreateInstance(type); // 动态创建实例

相当于:“我不写死 new MyClass(),而是让程序自己根据类型信息造对象!”

2️⃣ 泛型约束检查

public void DoSomething<T>()
{if (typeof(T) == typeof(string)){Console.WriteLine("传进来的是字符串!");}
}

“我这个泛型方法想知道,用户到底传了个啥类型进来?”

3️⃣ 日志、调试、框架底层

很多框架(比如 ASP.NET Core、EF Core)内部大量使用 typeof() 来获取类型元数据,做路由匹配、数据库映射等。

[ApiController]
[Route("[controller]")]
public class UserController : ControllerBase
{// 框架内部会用 typeof(UserController) 来注册路由
}

注意避坑:

  • typeof() 里面只能写类型名,不能写变量!

✅ 正确:

typeof(int)
typeof(List<string>)
typeof(MyClass)

❌ 错误:

string s = "hello";
typeof(s); // 编译报错!s 是变量,不是类型!
  • 如果你想获取某个对象的类型,用 GetType()
string s = "hello";
Type t = s.GetType(); // 运行时获取对象的实际类型

一句话总结区别:

typeof(类型名) → 编译时就知道 → 问的是“类型模板”
对象.GetType() → 运行时才知道 → 问的是“这个具体对象是谁”


通俗总结:

typeof() 就像你去派出所查一个人的“户口本信息”,你只需要提供“姓名”(类型名),就能拿到他的完整档案(Type对象)。
不管这个人有没有出生(对象有没有实例化),户口本早就存在了!

返回列表