ARTICLE DETAIL

资讯详情

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

反射运行时构造泛型的底层机制(大白话全景版)

反射运行时构造泛型的底层机制(大白话全景版)

你写 C#(或者 Java/Kotlin/TypeScript 那种带泛型味道的语言)写久了,迟早会碰到一个“看上去像黑魔法”的需求:

泛型类型参数不是写死的,是运行时才知道的。
比如:我只有一个Type t,我想创建List<t>、Dictionary<string, t>,甚至想调用Serializer<t>.Serialize()。

于是你就会学到一堆招数:
MakeGenericType、MakeGenericMethod、Activator.CreateInstance、Invoke、Delegate.CreateDelegate……
能跑是能跑,但你心里肯定犯嘀咕:

  • 运行时构造泛型到底是在“构造什么”?
  • CLR 里泛型是真泛型还是“语法糖”?
  • List<int>和List<string>在底层是一份代码还是两份?
  • 反射造出来的泛型会不会很慢?慢在哪?
  • 为什么到了 Unity IL2CPP / iOS AOT 就老出事?
  • JIT、AOT、共享代码、字典(dictionary)这些词到底什么意思?

今天这篇就用大白话 +

返回列表