private static Tuple <MethodInfo, RedirectCallsState> RedirectMethod(Type targetType, MethodInfo detour, bool reverse)
{
var parameters = detour.GetParameters();
Type[] types;
if (parameters.Length > 0 && (
(!targetType.IsValueType && parameters[0].ParameterType == targetType) ||
(targetType.IsValueType && parameters[0].ParameterType == targetType.MakeByRefType())))
{
types = parameters.Skip(1).Select(p => p.ParameterType).ToArray();
}
else
{
types = parameters.Select(p => p.ParameterType).ToArray();
}
var originalMethod = targetType.GetMethod(detour.Name,
BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static, null, types,
null);
var redirectCallsState =
reverse ? RedirectionHelper.RedirectCalls(detour, originalMethod) : RedirectionHelper.RedirectCalls(originalMethod, detour);
return(Tuple.New(reverse ? detour : originalMethod, redirectCallsState));
}