1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
5 using System.Collections.Generic;
6 using System.Diagnostics;
8 namespace System.Reflection.TypeLoading
11 /// Class for all RoMethod objects created by a MetadataLoadContext for which IsConstructedGenericMethod returns true.
13 internal sealed partial class RoConstructedGenericMethod : RoMethod
15 private readonly RoDefinitionMethod _genericMethodDefinition;
16 private readonly RoType[] _genericMethodArguments;
18 internal RoConstructedGenericMethod(RoDefinitionMethod genericMethodDefinition, RoType[] genericMethodArguments)
19 : base(genericMethodDefinition.ReflectedType)
21 Debug.Assert(genericMethodDefinition != null);
22 Debug.Assert(genericMethodArguments != null);
24 _genericMethodDefinition = genericMethodDefinition;
25 _genericMethodArguments = genericMethodArguments;
28 internal sealed override RoType GetRoDeclaringType() => _genericMethodDefinition.GetRoDeclaringType();
29 internal sealed override RoModule GetRoModule() => _genericMethodDefinition.GetRoModule();
31 protected sealed override string ComputeName() => _genericMethodDefinition.Name;
32 public sealed override int MetadataToken => _genericMethodDefinition.MetadataToken;
33 public sealed override IEnumerable<CustomAttributeData> CustomAttributes => _genericMethodDefinition.CustomAttributes;
34 public sealed override bool IsConstructedGenericMethod => true;
35 public sealed override bool IsGenericMethodDefinition => false;
36 protected sealed override MethodAttributes ComputeAttributes() => _genericMethodDefinition.Attributes;
37 protected sealed override CallingConventions ComputeCallingConvention() => _genericMethodDefinition.CallingConvention;
38 protected sealed override MethodImplAttributes ComputeMethodImplementationFlags() => _genericMethodDefinition.MethodImplementationFlags;
40 protected sealed override MethodSig<RoParameter> ComputeMethodSig() => _genericMethodDefinition.SpecializeMethodSig(this);
41 protected sealed override MethodSig<RoType> ComputeCustomModifiers() => _genericMethodDefinition.SpecializeCustomModifiers(TypeContext);
43 public sealed override MethodBody GetMethodBody() => _genericMethodDefinition.SpecializeMethodBody(this);
45 protected sealed override RoType[] ComputeGenericArgumentsOrParameters() => _genericMethodArguments;
47 internal sealed override RoType[] GetGenericTypeArgumentsNoCopy() => _genericMethodArguments;
48 internal sealed override RoType[] GetGenericTypeParametersNoCopy() => Array.Empty<RoType>();
50 public sealed override MethodInfo GetGenericMethodDefinition() => _genericMethodDefinition;
52 public sealed override MethodInfo MakeGenericMethod(params Type[] typeArguments) => throw new InvalidOperationException(SR.Format(SR.Arg_NotGenericMethodDefinition, this));
54 public sealed override bool Equals(object obj)
56 if (!(obj is RoConstructedGenericMethod other))
59 if (!(_genericMethodDefinition == other._genericMethodDefinition))
62 if (_genericMethodArguments.Length != other._genericMethodArguments.Length)
65 for (int i = 0; i < _genericMethodArguments.Length; i++)
67 if (_genericMethodArguments[i] != other._genericMethodArguments[i])
74 public sealed override int GetHashCode()
76 int hashCode = _genericMethodDefinition.GetHashCode();
77 foreach (Type genericMethodArgument in _genericMethodArguments)
79 hashCode ^= genericMethodArgument.GetHashCode();
84 protected sealed override MethodSig<string> ComputeMethodSigStrings() => _genericMethodDefinition.SpecializeMethodSigStrings(TypeContext);
86 public sealed override TypeContext TypeContext => new TypeContext(_genericMethodDefinition.TypeContext.GenericTypeArguments, _genericMethodArguments);