1

MakeArrayType()如果我们想制作特定类型的数组类型,使用它是没有问题的,例如char数组:

typeof(char).MakeArrayType()

当然使用起来更直观typeof(char[])

并且类型的属性Assembly告诉我们该类型在哪里的程序集。

因此,以下代码应该是在程序集中查找类型的合理示例:

var chars=new[] { '\x20' };
var typeofCharArray=chars.GetType();
var assembly=typeofCharArray.Assembly;
var doesContain=assembly.GetTypes().Contains(typeofCharArray);

但是doesContain说它没有,它是false。无论数组类型是来自MakeArrayType()ortypeof()还是实例的 ,都会发生这种情况GetType

怀疑它是否已转发到我从Assembly.GetTypes中读取的其他程序集。我试过了:

var assemblyContainsTypeOfCharArray=(
        from it in AppDomain.CurrentDomain.GetAssemblies()
        let types=it.GetTypes()
        where types.Contains(typeof(char[]))
        select it).FirstOrDefault();

有趣的assemblyContainsTypeOfCharArraynull

数组类型在哪里?

4

1 回答 1

4

简单地说:GetTypes()返回在该程序集中实际声明的类型。数组类型是......不是。他们声称来自那里,但这只是返回元素类型的Assembly信息。数组类型实际上并没有在其中 声明(它实际上没有在任何地方声明- 它是 JIT 的即时发明)。

所以基本上:数组类型. 可耻。

于 2013-07-29T19:34:21.200 回答