private MethodInfo GetMethodImpl(string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers)
{
foreach (var method in methods)
{
if (method.Name != name)
continue;
if ((bindingAttr & BindingFlags.NonPublic) != BindingFlags.NonPublic && !method.IsPublic)
continue;
var parameters = method.GetParametersNoCopy();
if (types != null && types.Length != parameters.Length)
continue;
if (types != null)
{
bool isValid = true;
for (var i = 0; i < types.Length; i++)
{
if (types[i].IsGenericType && parameters[i].ParameterType.IsGenericType)
{
if (!parameters[i].ParameterType.GetGenericTypeDefinition().IsAssignableFrom(types[i].GetGenericTypeDefinition()))
isValid = false;
}
else if (!parameters[i].ParameterType.IsAssignableFrom(types[i]))
isValid = false;
}
if (!isValid)
continue;
}
return method;
}
return null;
}