File: src\runtime\src\libraries\System.Private.CoreLib\src\System\Reflection\SignatureModifiedType.cs
Web Access
Project: src\runtime\src\coreclr\nativeaot\System.Private.CoreLib\src\System.Private.CoreLib.csproj (System.Private.CoreLib)
// 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
{
    internal sealed class SignatureModifiedType : SignatureType
    {
        internal SignatureModifiedType(Type baseType, Type[] requiredCustomModifiers, Type[] optionalCustomModifiers)
        {
            if (baseType.GetRequiredCustomModifiers() is Type[] modreqs)
                requiredCustomModifiers = [.. requiredCustomModifiers, .. modreqs];

            if (baseType.GetOptionalCustomModifiers() is Type[] modopts)
                optionalCustomModifiers = [.. optionalCustomModifiers, .. modopts];

            baseType = baseType.UnderlyingSystemType;
            _unmodifiedType = baseType;
            _requiredCustomModifiers = requiredCustomModifiers;
            _optionalCustomModifiers = optionalCustomModifiers;
        }

        private readonly Type _unmodifiedType;
        private readonly Type[] _requiredCustomModifiers;
        private readonly Type[] _optionalCustomModifiers;

        public override Type UnderlyingSystemType => _unmodifiedType;
        public override Type[] GetRequiredCustomModifiers() => (Type[])_requiredCustomModifiers.Clone();
        public override Type[] GetOptionalCustomModifiers() => (Type[])_optionalCustomModifiers.Clone();

        public override bool IsTypeDefinition => _unmodifiedType.IsTypeDefinition;
        public override bool IsSZArray => _unmodifiedType.IsSZArray;
        public override bool IsVariableBoundArray => _unmodifiedType.IsVariableBoundArray;
        public override bool IsByRefLike => _unmodifiedType.IsByRefLike;
        public override bool IsFunctionPointer => _unmodifiedType.IsFunctionPointer;
        public override bool IsGenericTypeDefinition => _unmodifiedType.IsGenericTypeDefinition;
        public override bool IsConstructedGenericType => _unmodifiedType.IsConstructedGenericType;
        public override bool IsGenericParameter => _unmodifiedType.IsGenericParameter;
        public override bool IsGenericTypeParameter => _unmodifiedType.IsGenericTypeParameter;
        public override bool IsGenericMethodParameter => _unmodifiedType.IsGenericMethodParameter;
        public override bool IsUnmanagedFunctionPointer => _unmodifiedType.IsUnmanagedFunctionPointer;
        public override bool ContainsGenericParameters => _unmodifiedType.ContainsGenericParameters;
        public override Type[] GenericTypeArguments => _unmodifiedType.GenericTypeArguments;
        public override int GenericParameterPosition => _unmodifiedType.GenericParameterPosition;
        internal override SignatureType? ElementType => HasElementType ? new SignatureModifiedType(_unmodifiedType.GetElementType()!, [], []) : null;
        public override Type? GetNullableUnderlyingType() => _unmodifiedType.GetNullableUnderlyingType();
        public override string Name => _unmodifiedType.Name;
        public override string? Namespace => _unmodifiedType.Namespace;
        public override bool IsEnum => _unmodifiedType.IsEnum;
        protected override bool HasElementTypeImpl() => _unmodifiedType.HasElementType;
        protected override bool IsArrayImpl() => _unmodifiedType.IsArray;
        protected override bool IsByRefImpl() => _unmodifiedType.IsByRef;
        protected override bool IsPointerImpl() => _unmodifiedType.IsPointer;
        public override int GetArrayRank() => _unmodifiedType.GetArrayRank();
        public override Type[] GetFunctionPointerCallingConventions() => _unmodifiedType.GetFunctionPointerCallingConventions();
        public override Type[] GetFunctionPointerParameterTypes() => _unmodifiedType.GetFunctionPointerParameterTypes();
        public override Type GetFunctionPointerReturnType() => _unmodifiedType.GetFunctionPointerReturnType();
        public override Type GetGenericTypeDefinition() => _unmodifiedType.GetGenericTypeDefinition();
        public override Type[] GetGenericArguments() => _unmodifiedType.GetGenericArguments();
        public override string ToString() => _unmodifiedType.ToString();
        protected override bool IsValueTypeImpl() => _unmodifiedType.IsValueType;
    }
}