39 ParameterInfo returnParameter;
40 ParameterInfo[] parameters;
53 this.declaringType = declaringType;
66 var rva = module.MethodDefTable.records[index].RVA;
67 return rva == 0 ? null :
new MethodBody(module, rva, context);
72 get {
return module.MethodDefTable.records[index].RVA; }
82 get {
return (MethodAttributes)module.MethodDefTable.records[index].Flags; }
87 return (MethodImplAttributes)module.MethodDefTable.records[index].ImplFlags;
93 return (ParameterInfo[])parameters.Clone();
96 void PopulateParameters()
98 if (parameters ==
null)
101 parameters =
new ParameterInfo[methodSignature.GetParameterCount()];
103 var parameter = module.MethodDefTable.records[index].ParamList - 1;
104 var end = module.MethodDefTable.records.Length > index + 1 ? module.MethodDefTable.records[index + 1].ParamList - 1 : module.ParamTable.records.Length;
105 for (; parameter < end; parameter++)
107 var seq = module.ParamTable.records[parameter].Sequence - 1;
114 for (
int i = 0; i < parameters.Length; i++)
115 if (parameters[i] ==
null)
116 parameters[i] =
new ParameterInfoImpl(
this, i, -1);
118 if (returnParameter ==
null)
119 returnParameter =
new ParameterInfoImpl(
this, -1, -1);
123 internal override Type[] GetParameterTypes()
126 for (
int i = 0; i < parameterTypes.Length; i++)
129 return parameterTypes;
132 internal override int ParameterCount
141 PopulateParameters();
142 return returnParameter;
156 get {
return declaringType.IsModulePseudoType ? null : declaringType; }
161 get {
return module.GetString(module.MethodDefTable.records[index].Name); }
173 PopulateGenericArguments();
174 return typeArgs.Length > 0;
185 PopulateGenericArguments();
186 return Util.Copy(typeArgs);
189 void PopulateGenericArguments()
191 if (typeArgs ==
null)
194 var first = module.GenericParamTable.FindFirstByOwner(token);
197 typeArgs = Type.EmptyTypes;
201 var list =
new List<Type>();
202 var len = module.GenericParamTable.records.Length;
203 for (
int i = first; i < len && module.GenericParamTable.records[i].Owner == token; i++)
204 list.Add(
new GenericTypeParameter(module, i,
Signature.ELEMENT_TYPE_MVAR));
206 typeArgs = list.ToArray();
211 internal override Type GetGenericMethodArgument(
int index)
213 PopulateGenericArguments();
214 return typeArgs[index];
217 internal override int GetGenericMethodArgumentCount()
219 PopulateGenericArguments();
220 return typeArgs.Length;
233 public override Module Module
235 get {
return module; }
240 get {
return lazyMethodSignature ??=
MethodSignature.ReadSig(module, module.GetBlobReader(module.MethodDefTable.records[index].Signature),
this); }
243 internal override int ImportTo(Emit.ModuleBuilder module)
250 Type[] typeArgs =
null;
251 List<MethodInfo> list =
null;
253 foreach (var i
in module.MethodImplTable.Filter(declaringType.MetadataToken))
255 if (module.MethodImplTable.records[i].MethodBody ==
this.MetadataToken)
257 typeArgs ??= declaringType.GetGenericArguments();
258 list ??=
new List<MethodInfo>();
259 list.Add((MethodInfo)module.ResolveMethod(module.MethodImplTable.records[i].MethodDeclaration, typeArgs,
null));
263 return Util.ToArray(list, Array.Empty<MethodInfo>());
266 internal override int GetCurrentToken()
271 internal override bool IsBaked