private static bool IsCompatible(MethodBase m, Expression[] arguments)
{
ParameterInfo[] parms = m.GetParametersCached();
if (parms.Length != arguments.Length)
return false;
for (int i = 0; i < arguments.Length; i++)
{
Expression arg = arguments[i];
ContractUtils.RequiresNotNull(arg, nameof(arguments));
Type argType = arg.Type;
Type pType = parms[i].ParameterType;
if (pType.IsByRef)
{
pType = pType.GetElementType();
}
if (!TypeUtils.AreReferenceAssignable(pType, argType) &&
!(TypeUtils.IsSameOrSubclass(typeof(LambdaExpression), pType) && pType.IsAssignableFrom(arg.GetType())))
{
return false;
}
}
return true;
}