private static Delegate ToMemberDelegate(Type signature, object app)
{
MethodInfo signatureMethod = signature.GetMethod(Constants.Invoke);
ParameterInfo[] signatureParameters = signatureMethod.GetParameters();
MethodInfo[] methods = app.GetType().GetMethods();
foreach (MethodInfo method in methods)
{
if (method.Name != Constants.Invoke)
{
continue;
}
ParameterInfo[] methodParameters = method.GetParameters();
if (methodParameters.Length != signatureParameters.Length)
{
continue;
}
if (methodParameters
.Zip(signatureParameters, (methodParameter, signatureParameter) => methodParameter.ParameterType.IsAssignableFrom(signatureParameter.ParameterType))
.Any(compatible => compatible == false))
{
continue;
}
if (!signatureMethod.ReturnType.IsAssignableFrom(method.ReturnType))
{
continue;
}
return Delegate.CreateDelegate(signature, app, method);
}
return null;
}