System.RuntimeCustomAttributeData.ResolveArgumentValue C# (CSharp) Method

ResolveArgumentValue() private method

private ResolveArgumentValue ( MetadataCAArgumentStruct argument, Type type ) : object
argument Mosa.Runtime.MetadataCAArgumentStruct
type Type
return object
        private object ResolveArgumentValue(MetadataCAArgumentStruct* argument, Type type)
        {
            TypeCode typeCode = (TypeCode)(argument->ArgumentType->Attributes >> 24);
            var valuePtr = MetadataCAArgumentStruct.GetArgumentAddress(argument);

            // If its an enum type
            if (argument->ArgumentType->ParentType == EnumTypePtr)
            {
                typeCode = (TypeCode)(argument->ArgumentType->ElementType->Attributes >> 24);
            }

            switch (typeCode)
            {
                // 1 byte
                case TypeCode.Boolean:
                    return ((bool*)valuePtr)[0];

                case TypeCode.U1:
                    return ((byte*)valuePtr)[0];

                case TypeCode.I1:
                    return ((sbyte*)valuePtr)[0];

                // 2 bytes
                case TypeCode.Char:
                    return ((char*)valuePtr)[0];

                case TypeCode.U2:
                    return ((ushort*)valuePtr)[0];

                case TypeCode.I2:
                    return ((short*)valuePtr)[0];

                // 4 bytes
                case TypeCode.U4:
                    return valuePtr[0];

                case TypeCode.I4:
                    return ((int*)valuePtr)[0];

                case TypeCode.R4:
                    return ((float*)valuePtr)[0];

                // 8 bytes
                case TypeCode.U8:
                    return ((ulong*)valuePtr)[0];

                case TypeCode.I8:
                    return ((long*)valuePtr)[0];

                case TypeCode.R8:
                    return ((double*)valuePtr)[0];

                // SZArray
                case TypeCode.SZArray:
                    return ResolveArrayValue(argument, type);

                // String
                case TypeCode.String:
                    return Mosa.Runtime.Internal.InitializeMetadataString(valuePtr);

                default:
                    if (type.FullName == "System.Type")
                    {
                        // Get the argument type
                        RuntimeTypeHandle argTypeHandle = new RuntimeTypeHandle();
                        ((uint**)&argTypeHandle)[0] = (uint*)argument->ArgumentType;
                        return Type.GetTypeFromHandle(argTypeHandle);
                    }
                    throw new ArgumentException();
            }

            //return null;
        }