的System.Array 用作基类在公共语言运行时(CLR)的所有阵列。根据本文

  

有关每个具体数组类型,[该]运行时增加了三种特殊的方法:Get / Set / Address

和确实,如果我拆解此C#代码,

int[,] x = new int[1024,1024];
x[0,0] = 1;
x[1,1] = 2;
x[2,2] = 3;
Console.WriteLine(x[0,0]);
Console.WriteLine(x[1,1]);
Console.WriteLine(x[2,2]);

成CIL我得到的,

IL_0000:  ldc.i4     0x400
IL_0005:  ldc.i4     0x400
IL_000a:  newobj     instance void int32[0...,0...]::.ctor(int32,
                                                         int32)
IL_000f:  stloc.0
IL_0010:  ldloc.0
IL_0011:  ldc.i4.0
IL_0012:  ldc.i4.0
IL_0013:  ldc.i4.1
IL_0014:  call       instance void int32[0...,0...]::Set(int32,
                                                       int32,
                                                       int32)
IL_0019:  ldloc.0
IL_001a:  ldc.i4.1
IL_001b:  ldc.i4.1
IL_001c:  ldc.i4.2
IL_001d:  call       instance void int32[0...,0...]::Set(int32,
                                                       int32,
                                                       int32)
IL_0022:  ldloc.0
IL_0023:  ldc.i4.2
IL_0024:  ldc.i4.2
IL_0025:  ldc.i4.3
IL_0026:  call       instance void int32[0...,0...]::Set(int32,
                                                       int32,
                                                       int32)
IL_002b:  ldloc.0
IL_002c:  ldc.i4.0
IL_002d:  ldc.i4.0
IL_002e:  call       instance int32 int32[0...,0...]::Get(int32,
                                                        int32)
IL_0033:  call       void [mscorlib]System.Console::WriteLine(int32)
IL_0038:  ldloc.0
IL_0039:  ldc.i4.1
IL_003a:  ldc.i4.1
IL_003b:  call       instance int32 int32[0...,0...]::Get(int32,
                                                        int32)
IL_0040:  call       void [mscorlib]System.Console::WriteLine(int32)
IL_0045:  ldloc.0
IL_0046:  ldc.i4.2
IL_0047:  ldc.i4.2
IL_0048:  call       instance int32 int32[0...,0...]::Get(int32,
                                                        int32)
IL_004d:  call       void [mscorlib]System.Console::WriteLine(int32)

其中上述GetSet方法的调用可以清楚地看到。看来这些方法的元数是关系到阵列,这大概是为什么它们是由运行时创建,并且没有预先宣布的维度。我无法找到有关这些方法在MSDN和他们简单的名称的任何信息,使他们能够抵抗谷歌搜索。我正在写支持多维数组一个语言的编译器,所以我想找到有关这些方法,在什么情况下我能指望他们有什么我可以期待他们的签名是一些官方文件。

在特别地,我想知道是否其可能获得对MethodInfoGet用于与Set使用Reflection.Emit对象,而无需创建实例与正确的类型和维度在阵列的这反映,如在链接的示例来完成。

有帮助吗?

解决方案

看这里,具体上63-65页部分14.2

http://download.microsoft.com/download/7/3/3/733AD403-90B2-4064-A81E-01035A7FE13C/MS%20Partition%20II.pdf

但外卖,你可以从IL告诉,是他们的getter和setter方法在给定的索引位置与数组处理。

  

•一个Get方法,它利用一个序列   INT32参数,每一个   返回所述阵列的尺寸,并且一个   值,其类型是元素类型   阵列的。此方法用于   访问阵列的特定元素   其中参数指定索引   到每个层面,开始用   所述第一元件的,要   返回。

     

•一组方法,它的序列   的INT32参数,每一个   该阵列的尺寸,接着进行   值,其类型是元素类型   阵列的。集的返回类型   是无效的。这种方法用于设置一   的阵列,其中的特定元件   该参数指定的索引   每个维度,与开始   首先,元件的要被设置和   最后一个参数指定的值   要被存储到目标元件。

     

•,需要一个一个地址方法   的INT32参数序列,一个用于   所述阵列的每一维,且具有   返回类型是托管指针   到阵列的元件的类型。这个   方法用来返回一个管理   指针的特定元素   阵列,其中所述参数指定   索引到每个维度,开始   与第一其元素的,   地址是要被返回。

编辑:,使用文档的页码的页63-65。 73-75在实际的PDF。

其他提示

要回答你的第二个问题,你并不需要创建一个实例来获得这些方法的MethodInfo。类似

var mi = typeof(string).MakeArrayType(6).GetMethod("Get");

将努力得到该Get类型string[,,,,,]方法。

scroll top