private void GetOwnerTypeAndTypeArgs(out Type ownerType, out Type[] typeArgs) { Type genericType = this.m_resolver.ResolveTypeDefToken(this.m_declaringTypeDef); GenericContext genericContext = new GenericContext(this.m_typeArgs, this.m_methodArgs); if (genericType.IsGenericType && GenericContext.IsNullOrEmptyTypeArgs(genericContext)) { genericContext = new GenericContext(genericType.GetGenericArguments(), this.m_methodArgs); } genericType = this.m_resolver.GetGenericType(new Token(genericType.MetadataToken), genericContext); ownerType = genericType; typeArgs = genericContext.TypeArgs; }
internal static TypeSignatureDescriptor ExtractType(byte[] sig, ref int index, MetadataOnlyModule resolver, GenericContext context, bool fAllowPinned) { TypeSignatureDescriptor typeSignatureDescriptor = new TypeSignatureDescriptor() { IsPinned = false }; System.Reflection.Adds.CorElementType corElementType = SignatureUtil.ExtractElementType(sig, ref index); switch (corElementType) { case System.Reflection.Adds.CorElementType.End: case System.Reflection.Adds.CorElementType.Array | System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.Char | System.Reflection.Adds.CorElementType.Class | System.Reflection.Adds.CorElementType.SByte | System.Reflection.Adds.CorElementType.Short | System.Reflection.Adds.CorElementType.TypedByRef | System.Reflection.Adds.CorElementType.Byte | System.Reflection.Adds.CorElementType.UShort | System.Reflection.Adds.CorElementType.ValueType | System.Reflection.Adds.CorElementType.Void | System.Reflection.Adds.CorElementType.TypeVar | System.Reflection.Adds.CorElementType.GenericInstantiation: case System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.Class | System.Reflection.Adds.CorElementType.IntPtr | System.Reflection.Adds.CorElementType.Int | System.Reflection.Adds.CorElementType.Long: case System.Reflection.Adds.CorElementType.Internal: case System.Reflection.Adds.CorElementType.Max: case System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.Char | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.Internal | System.Reflection.Adds.CorElementType.Max | System.Reflection.Adds.CorElementType.Void: case System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.SByte: case System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.SByte | System.Reflection.Adds.CorElementType.Internal | System.Reflection.Adds.CorElementType.Byte | System.Reflection.Adds.CorElementType.Void: case System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.SByte | System.Reflection.Adds.CorElementType.Short | System.Reflection.Adds.CorElementType.Max: case System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.Char | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.SByte | System.Reflection.Adds.CorElementType.Short | System.Reflection.Adds.CorElementType.Internal | System.Reflection.Adds.CorElementType.Max | System.Reflection.Adds.CorElementType.Byte | System.Reflection.Adds.CorElementType.UShort | System.Reflection.Adds.CorElementType.Void: case System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.Int: case System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.Int | System.Reflection.Adds.CorElementType.Internal | System.Reflection.Adds.CorElementType.UInt | System.Reflection.Adds.CorElementType.Void: case System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.Int | System.Reflection.Adds.CorElementType.Long | System.Reflection.Adds.CorElementType.Max: case System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.Char | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.Int | System.Reflection.Adds.CorElementType.Long | System.Reflection.Adds.CorElementType.Internal | System.Reflection.Adds.CorElementType.Max | System.Reflection.Adds.CorElementType.UInt | System.Reflection.Adds.CorElementType.ULong | System.Reflection.Adds.CorElementType.Void: case System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.SByte | System.Reflection.Adds.CorElementType.Int | System.Reflection.Adds.CorElementType.Float: case System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.SByte | System.Reflection.Adds.CorElementType.Int | System.Reflection.Adds.CorElementType.Internal | System.Reflection.Adds.CorElementType.Float | System.Reflection.Adds.CorElementType.Double | System.Reflection.Adds.CorElementType.Byte | System.Reflection.Adds.CorElementType.UInt | System.Reflection.Adds.CorElementType.Void: case System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.SByte | System.Reflection.Adds.CorElementType.Short | System.Reflection.Adds.CorElementType.Int | System.Reflection.Adds.CorElementType.Long | System.Reflection.Adds.CorElementType.Max | System.Reflection.Adds.CorElementType.Float | System.Reflection.Adds.CorElementType.String: case System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.Char | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.SByte | System.Reflection.Adds.CorElementType.Short | System.Reflection.Adds.CorElementType.Int | System.Reflection.Adds.CorElementType.Long | System.Reflection.Adds.CorElementType.Internal | System.Reflection.Adds.CorElementType.Max | System.Reflection.Adds.CorElementType.Pointer | System.Reflection.Adds.CorElementType.Float | System.Reflection.Adds.CorElementType.Double | System.Reflection.Adds.CorElementType.String | System.Reflection.Adds.CorElementType.Byte | System.Reflection.Adds.CorElementType.UShort | System.Reflection.Adds.CorElementType.UInt | System.Reflection.Adds.CorElementType.ULong | System.Reflection.Adds.CorElementType.Void: case System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.CModOpt: case System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.Internal | System.Reflection.Adds.CorElementType.ValueType | System.Reflection.Adds.CorElementType.Void: case System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.Class | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.Max: case System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.Char | System.Reflection.Adds.CorElementType.Class | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.Internal | System.Reflection.Adds.CorElementType.Max | System.Reflection.Adds.CorElementType.ValueType | System.Reflection.Adds.CorElementType.Void | System.Reflection.Adds.CorElementType.TypeVar: case System.Reflection.Adds.CorElementType.Array | System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.SByte: case System.Reflection.Adds.CorElementType.Array | System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.SByte | System.Reflection.Adds.CorElementType.Internal | System.Reflection.Adds.CorElementType.Byte | System.Reflection.Adds.CorElementType.ValueType | System.Reflection.Adds.CorElementType.Void | System.Reflection.Adds.CorElementType.GenericInstantiation: case System.Reflection.Adds.CorElementType.Array | System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.Class | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.SByte | System.Reflection.Adds.CorElementType.Short | System.Reflection.Adds.CorElementType.Max | System.Reflection.Adds.CorElementType.TypedByRef: case System.Reflection.Adds.CorElementType.Array | System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.Char | System.Reflection.Adds.CorElementType.Class | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.SByte | System.Reflection.Adds.CorElementType.Short | System.Reflection.Adds.CorElementType.Internal | System.Reflection.Adds.CorElementType.Max | System.Reflection.Adds.CorElementType.TypedByRef | System.Reflection.Adds.CorElementType.Byte | System.Reflection.Adds.CorElementType.UShort | System.Reflection.Adds.CorElementType.ValueType | System.Reflection.Adds.CorElementType.Void | System.Reflection.Adds.CorElementType.TypeVar | System.Reflection.Adds.CorElementType.GenericInstantiation: case System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.IntPtr | System.Reflection.Adds.CorElementType.Int: case System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.IntPtr | System.Reflection.Adds.CorElementType.Int | System.Reflection.Adds.CorElementType.Internal | System.Reflection.Adds.CorElementType.UIntPtr | System.Reflection.Adds.CorElementType.UInt | System.Reflection.Adds.CorElementType.ValueType | System.Reflection.Adds.CorElementType.Void: case System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.Class | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.IntPtr | System.Reflection.Adds.CorElementType.Int | System.Reflection.Adds.CorElementType.Long | System.Reflection.Adds.CorElementType.Max: case System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.Char | System.Reflection.Adds.CorElementType.Class | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.FnPtr | System.Reflection.Adds.CorElementType.IntPtr | System.Reflection.Adds.CorElementType.Int | System.Reflection.Adds.CorElementType.Long | System.Reflection.Adds.CorElementType.Internal | System.Reflection.Adds.CorElementType.Max | System.Reflection.Adds.CorElementType.UIntPtr | System.Reflection.Adds.CorElementType.UInt | System.Reflection.Adds.CorElementType.ULong | System.Reflection.Adds.CorElementType.ValueType | System.Reflection.Adds.CorElementType.Void | System.Reflection.Adds.CorElementType.TypeVar: case System.Reflection.Adds.CorElementType.Array | System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.IntPtr | System.Reflection.Adds.CorElementType.SByte | System.Reflection.Adds.CorElementType.Int | System.Reflection.Adds.CorElementType.Object | System.Reflection.Adds.CorElementType.Float: case System.Reflection.Adds.CorElementType.Array | System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.IntPtr | System.Reflection.Adds.CorElementType.SByte | System.Reflection.Adds.CorElementType.Int | System.Reflection.Adds.CorElementType.Internal | System.Reflection.Adds.CorElementType.Object | System.Reflection.Adds.CorElementType.Float | System.Reflection.Adds.CorElementType.Double | System.Reflection.Adds.CorElementType.SzArray | System.Reflection.Adds.CorElementType.UIntPtr | System.Reflection.Adds.CorElementType.Byte | System.Reflection.Adds.CorElementType.UInt | System.Reflection.Adds.CorElementType.ValueType | System.Reflection.Adds.CorElementType.Void | System.Reflection.Adds.CorElementType.GenericInstantiation: case System.Reflection.Adds.CorElementType.Array | System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.Class | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.IntPtr | System.Reflection.Adds.CorElementType.SByte | System.Reflection.Adds.CorElementType.Short | System.Reflection.Adds.CorElementType.Int | System.Reflection.Adds.CorElementType.Long | System.Reflection.Adds.CorElementType.Max | System.Reflection.Adds.CorElementType.Object | System.Reflection.Adds.CorElementType.Float | System.Reflection.Adds.CorElementType.String | System.Reflection.Adds.CorElementType.TypedByRef | System.Reflection.Adds.CorElementType.MethodVar: case System.Reflection.Adds.CorElementType.Array | System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.Byref | System.Reflection.Adds.CorElementType.Char | System.Reflection.Adds.CorElementType.Class | System.Reflection.Adds.CorElementType.CModOpt | System.Reflection.Adds.CorElementType.CModReqd | System.Reflection.Adds.CorElementType.FnPtr | System.Reflection.Adds.CorElementType.IntPtr | System.Reflection.Adds.CorElementType.SByte | System.Reflection.Adds.CorElementType.Short | System.Reflection.Adds.CorElementType.Int | System.Reflection.Adds.CorElementType.Long | System.Reflection.Adds.CorElementType.Internal | System.Reflection.Adds.CorElementType.Max | System.Reflection.Adds.CorElementType.Object | System.Reflection.Adds.CorElementType.Pointer | System.Reflection.Adds.CorElementType.Float | System.Reflection.Adds.CorElementType.Double | System.Reflection.Adds.CorElementType.String | System.Reflection.Adds.CorElementType.SzArray | System.Reflection.Adds.CorElementType.TypedByRef | System.Reflection.Adds.CorElementType.UIntPtr | System.Reflection.Adds.CorElementType.Byte | System.Reflection.Adds.CorElementType.UShort | System.Reflection.Adds.CorElementType.UInt | System.Reflection.Adds.CorElementType.ULong | System.Reflection.Adds.CorElementType.ValueType | System.Reflection.Adds.CorElementType.Void | System.Reflection.Adds.CorElementType.TypeVar | System.Reflection.Adds.CorElementType.MethodVar | System.Reflection.Adds.CorElementType.GenericInstantiation: case System.Reflection.Adds.CorElementType.Modifier: case System.Reflection.Adds.CorElementType.Sentinel: case System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.Modifier: case System.Reflection.Adds.CorElementType.Bool | System.Reflection.Adds.CorElementType.Char | System.Reflection.Adds.CorElementType.Modifier | System.Reflection.Adds.CorElementType.Sentinel | System.Reflection.Adds.CorElementType.Void: case System.Reflection.Adds.CorElementType.SByte | System.Reflection.Adds.CorElementType.Modifier: { throw new ArgumentException(MetadataStringTable.IncorrectElementTypeValue); } case System.Reflection.Adds.CorElementType.Void: case System.Reflection.Adds.CorElementType.Bool: case System.Reflection.Adds.CorElementType.Char: case System.Reflection.Adds.CorElementType.SByte: case System.Reflection.Adds.CorElementType.Byte: case System.Reflection.Adds.CorElementType.Short: case System.Reflection.Adds.CorElementType.UShort: case System.Reflection.Adds.CorElementType.Int: case System.Reflection.Adds.CorElementType.UInt: case System.Reflection.Adds.CorElementType.Long: case System.Reflection.Adds.CorElementType.ULong: case System.Reflection.Adds.CorElementType.Float: case System.Reflection.Adds.CorElementType.Double: case System.Reflection.Adds.CorElementType.String: case System.Reflection.Adds.CorElementType.IntPtr: case System.Reflection.Adds.CorElementType.UIntPtr: case System.Reflection.Adds.CorElementType.Object: { typeSignatureDescriptor.Type = resolver.AssemblyResolver.GetBuiltInType(corElementType); break; } case System.Reflection.Adds.CorElementType.Pointer: { typeSignatureDescriptor.Type = SignatureUtil.ExtractType(sig, ref index, resolver, context).MakePointerType(); break; } case System.Reflection.Adds.CorElementType.Byref: { typeSignatureDescriptor.Type = SignatureUtil.ExtractType(sig, ref index, resolver, context).MakeByRefType(); break; } case System.Reflection.Adds.CorElementType.ValueType: case System.Reflection.Adds.CorElementType.Class: { Token token = SignatureUtil.ExtractToken(sig, ref index); typeSignatureDescriptor.Type = resolver.ResolveTypeTokenInternal(token, context); break; } case System.Reflection.Adds.CorElementType.TypeVar: { int num = SignatureUtil.ExtractInt(sig, ref index); if (GenericContext.IsNullOrEmptyTypeArgs(context)) { throw new ArgumentException(MetadataStringTable.TypeArgumentCannotBeResolved); } typeSignatureDescriptor.Type = context.TypeArgs[num]; break; } case System.Reflection.Adds.CorElementType.Array: { Type type = SignatureUtil.ExtractType(sig, ref index, resolver, context); int num1 = SignatureUtil.ExtractInt(sig, ref index); int num2 = SignatureUtil.ExtractInt(sig, ref index); for (int i = 0; i < num2; i++) { SignatureUtil.ExtractInt(sig, ref index); } int num3 = SignatureUtil.ExtractInt(sig, ref index); for (int j = 0; j < num3; j++) { SignatureUtil.ExtractInt(sig, ref index); } typeSignatureDescriptor.Type = type.MakeArrayType(num1); break; } case System.Reflection.Adds.CorElementType.GenericInstantiation: { Type type1 = SignatureUtil.ExtractType(sig, ref index, resolver, null); Type[] typeArray = new Type[SignatureUtil.ExtractInt(sig, ref index)]; for (int k = 0; k < (int)typeArray.Length; k++) { typeArray[k] = SignatureUtil.ExtractType(sig, ref index, resolver, context); } typeSignatureDescriptor.Type = type1.MakeGenericType(typeArray); break; } case System.Reflection.Adds.CorElementType.TypedByRef: { typeSignatureDescriptor.Type = resolver.AssemblyResolver.GetTypeXFromName("System.TypedReference"); break; } case System.Reflection.Adds.CorElementType.FnPtr: { SignatureUtil.ExtractCallingConvention(sig, ref index); int num4 = SignatureUtil.ExtractInt(sig, ref index); SignatureUtil.ExtractType(sig, ref index, resolver, context); for (int l = 0; l < num4; l++) { SignatureUtil.ExtractType(sig, ref index, resolver, context); } typeSignatureDescriptor.Type = resolver.AssemblyResolver.GetBuiltInType(System.Reflection.Adds.CorElementType.IntPtr); break; } case System.Reflection.Adds.CorElementType.SzArray: { typeSignatureDescriptor.Type = SignatureUtil.ExtractType(sig, ref index, resolver, context).MakeArrayType(); break; } case System.Reflection.Adds.CorElementType.MethodVar: { int num5 = SignatureUtil.ExtractInt(sig, ref index); if (GenericContext.IsNullOrEmptyMethodArgs(context)) { throw new ArgumentException(MetadataStringTable.TypeArgumentCannotBeResolved); } typeSignatureDescriptor.Type = context.MethodArgs[num5]; break; } case System.Reflection.Adds.CorElementType.CModReqd: { Token token1 = SignatureUtil.ExtractToken(sig, ref index); resolver.ResolveTypeTokenInternal(token1, context); typeSignatureDescriptor.Type = SignatureUtil.ExtractType(sig, ref index, resolver, context); break; } case System.Reflection.Adds.CorElementType.CModOpt: { Token token2 = SignatureUtil.ExtractToken(sig, ref index); resolver.ResolveTypeTokenInternal(token2, context); typeSignatureDescriptor.Type = SignatureUtil.ExtractType(sig, ref index, resolver, context); break; } case System.Reflection.Adds.CorElementType.Pinned: { typeSignatureDescriptor.IsPinned = true; typeSignatureDescriptor.Type = SignatureUtil.ExtractType(sig, ref index, resolver, context); break; } default: { throw new ArgumentException(MetadataStringTable.IncorrectElementTypeValue); } } return(typeSignatureDescriptor); }