// Looks up an array RuntimeTypeHandle given an element's RuntimeTypeHandle and rank. A rank of -1 indicates SzArray internal bool TryGetArrayTypeForElementType_LookupOnly(RuntimeTypeHandle elementTypeHandle, bool isMdArray, int rank, out RuntimeTypeHandle arrayTypeHandle) { if (isMdArray && (rank < MDArray.MinRank) && (rank > MDArray.MaxRank)) { arrayTypeHandle = default(RuntimeTypeHandle); return false; } if (TypeSystemContext.GetArrayTypesCache(isMdArray, rank).TryGetValue(elementTypeHandle, out arrayTypeHandle)) return true; if (!isMdArray && !RuntimeAugments.IsDynamicType(elementTypeHandle) && TryGetArrayTypeForNonDynamicElementType(elementTypeHandle, out arrayTypeHandle)) { TypeSystemContext.GetArrayTypesCache(isMdArray, rank).AddOrGetExisting(arrayTypeHandle); return true; } return false; }
// Get an array RuntimeTypeHandle given an element's RuntimeTypeHandle and rank. Pass false for isMdArray, and rank == -1 for SzArrays public bool TryGetArrayTypeForElementType(RuntimeTypeHandle elementTypeHandle, bool isMdArray, int rank, out RuntimeTypeHandle arrayTypeHandle) { if (TryGetArrayTypeForElementType_LookupOnly(elementTypeHandle, isMdArray, rank, out arrayTypeHandle)) { return true; } using (LockHolder.Hold(_typeLoaderLock)) { if (isMdArray && (rank < MDArray.MinRank) && (rank > MDArray.MaxRank)) { arrayTypeHandle = default(RuntimeTypeHandle); return false; } if (TypeSystemContext.GetArrayTypesCache(isMdArray, rank).TryGetValue(elementTypeHandle, out arrayTypeHandle)) return true; return TypeBuilder.TryBuildArrayType(elementTypeHandle, isMdArray, rank, out arrayTypeHandle); } }