protected virtual MethodInfo VisitMethod(MethodInfo methodToSearch)
{
var newReflectedType = VisitType(methodToSearch.ReflectedType);
if (newReflectedType != methodToSearch.ReflectedType)
{
methodToSearch = newReflectedType.GetMethod(methodToSearch.Name,
(methodToSearch.IsStatic ? BindingFlags.Static : BindingFlags.Instance)
| (methodToSearch.IsPublic
? BindingFlags.Public
: BindingFlags.NonPublic),
null,
methodToSearch.GetParameters().Select(x => x.ParameterType).ToArray(),
null);
}
if (!methodToSearch.IsGenericMethod)
return methodToSearch;
var genArgs = methodToSearch.GetGenericArguments();
var newGenArgs = genArgs.Select(VisitType).ToArray();
if (genArgs.SequenceEqual(newGenArgs))
return methodToSearch;
return methodToSearch.GetGenericMethodDefinition().MakeGenericMethod(newGenArgs);
}