private void CallOriginal(MethodInfo mi, IEnumerable<ParameterExpression> parameters,
ParameterExpression eventArgs)
{
Func<object[], DetourCallbackEventArgs, object> actualCall = (p, e) =>
{
object ret = null;
if (e.CallOriginal)
{
ret = _notifier._detour.Invoke(p);
}
if (e.ReturnValue != null)
{
ret = e.ReturnValue;
}
return ret;
};
NewArrayExpression parametersAsArray = Expression.NewArrayInit(typeof(object),
from p in parameters select Expression.Convert(p, typeof(object)));
MethodCallExpression callOriginal = Expression.Call(Expression.Constant(actualCall.Target),
actualCall.Method,
parametersAsArray, eventArgs);
if (HasNoReturnValue(mi))
{
_body.Add(callOriginal);
_body.Add(Expression.Empty());
}
else
{
_body.Add(Expression.Convert(callOriginal, mi.ReturnType));
}
}