public IMethodReference FindMethod(uint metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments)
{
// Lookup the type in the cache
List <GenericReference <IMethodReference> > genericMethodReferences;
if (_genericTokenMethodMap.TryGetValue(metadataToken, out genericMethodReferences))
{
foreach (GenericReference <IMethodReference> r in genericMethodReferences)
{
if (CompareArrays(r.GenericArgs, genericMethodArguments))
{
return(r.Reference);
}
}
}
IList <ITypeReference> genericArguments = new List <ITypeReference>();
foreach (Type type in genericTypeArguments)
{
genericArguments.Add(AssemblyManager.FindType(type, type.GetGenericArguments()));
}
MethodBase methodBase = _netModule.ResolveMethod((int)metadataToken, genericTypeArguments, genericMethodArguments);
IMethodDeclaration methodDeclaration;
if (methodBase is ConstructorInfo)
{
methodDeclaration = new ConstructorDeclaration((ConstructorInfo)methodBase, this,
AssemblyManager.FindType(methodBase.DeclaringType, methodBase.DeclaringType.GetGenericArguments()));
}
else
{
methodDeclaration = new MethodDeclaration((MethodInfo)methodBase, this,
AssemblyManager.FindType(methodBase.DeclaringType, methodBase.DeclaringType.GetGenericArguments()));
}
if (genericMethodReferences == null)
{
genericMethodReferences = new List <GenericReference <IMethodReference> >();
_genericTokenMethodMap.Add(metadataToken, genericMethodReferences);
}
genericMethodReferences.Add(new GenericReference <IMethodReference>(methodDeclaration, genericTypeArguments));
return(methodDeclaration);
}