File: System\Reflection\TypeLoading\General\CoreTypes.cs
Web Access
Project: src\src\libraries\System.Reflection.MetadataLoadContext\src\System.Reflection.MetadataLoadContext.csproj (System.Reflection.MetadataLoadContext)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
namespace System.Reflection.TypeLoading
{
    /// <summary>
    /// A convenience class that holds the palette of core types that were successfully loaded (or the reason they were not.)
    /// </summary>
    internal sealed class CoreTypes
    {
        private readonly RoType?[] _coreTypes;
        private readonly Exception?[] _exceptions;
 
        internal CoreTypes(MetadataLoadContext loader, string? coreAssemblyName)
        {
            int numCoreTypes = (int)CoreType.NumCoreTypes;
            RoType?[] coreTypes = new RoType[numCoreTypes];
            Exception?[] exceptions = new Exception[numCoreTypes];
            RoAssembly? coreAssembly = loader.TryGetCoreAssembly(coreAssemblyName, out Exception? e);
            if (coreAssembly == null)
            {
                // If the core assembly was not found, don't continue.
                throw e!;
            }
            else
            {
                for (int i = 0; i < numCoreTypes; i++)
                {
                    ((CoreType)i).GetFullName(out ReadOnlySpan<byte> ns, out ReadOnlySpan<byte> name);
                    RoType? type = coreAssembly.GetTypeCore(ns, name, ignoreCase: false, out e);
                    coreTypes[i] = type;
                    if (type == null)
                    {
                        exceptions[i] = e;
                    }
                }
            }
            _coreTypes = coreTypes;
            _exceptions = exceptions;
        }
 
        /// <summary>
        /// Returns null if the specific core type did not exist or could not be loaded. Call GetException(coreType) to get detailed info.
        /// </summary>
        public RoType? this[CoreType coreType] => _coreTypes[(int)coreType];
        public Exception? GetException(CoreType coreType) => _exceptions[(int)coreType];
    }
}