Ken*_*Kin 2 c# clr jit .net-assembly
如果我们想制作一个特定类型的数组类型,使用起来没有问题MakeArrayType(),例如数组char:
typeof(char).MakeArrayType()
Run Code Online (Sandbox Code Playgroud)
当然用起来更直观typeof(char[])。
Assembly类型的属性告诉我们该类型所在的程序集是什么。
因此,以下代码应该是在程序集中查找类型的合理示例:
var chars=new[] { '\x20' };
var typeofCharArray=chars.GetType();
var assembly=typeofCharArray.Assembly;
var doesContain=assembly.GetTypes().Contains(typeofCharArray);
Run Code Online (Sandbox Code Playgroud)
但doesContain说它不是,它是false。无论数组类型是来自MakeArrayType()or typeof(),还是实例的 ,都会发生这种情况GetType。
怀疑它是否被转发到我从Assembly.GetTypes读取的其他程序集。我尝试过:
var assemblyContainsTypeOfCharArray=(
from it in AppDomain.CurrentDomain.GetAssemblies()
let types=it.GetTypes()
where types.Contains(typeof(char[]))
select it).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
有趣的assemblyContainsTypeOfCharArray是null。
数组类型在哪里?
简单地说:GetTypes()返回该程序集中实际声明的类型。数组类型是...不是。他们声称来自那里,但这只是返回元素类型的Assembly信息。数组类型实际上并没有在那里 声明(它实际上没有在任何地方声明- 它是 JIT 的发明,即时的)。
所以基本上:数组类型在于。对此感到羞耻。