protected override Expression VisitMethodCall(MethodCallExpression expression) { // TODO: Support TryResolve (Type/Key, <T>/Key), GetAll(), and TryGetAll() // Intercept calls to Resolve() and Resolve<>() on the input parameter and try to handle the method call by replacing it with something "faster" if (expression.IsMethod<IResolver, object>(resolver => resolver.Resolve((Type)null))) { // Resolve(Type) var typeArg = expression.GetMethodArgument<Type>(0); return HandleMethodCall(typeArg) ?? base.VisitMethodCall(expression); } if (expression.IsMethod<IResolver, object>(resolver => resolver.Resolve((Type)null, (object)null))) { // Resolve(Type, Key) var typeArg = expression.GetMethodArgument<Type>(0); var keyArg = expression.GetMethodArgument<object>(1); return HandleMethodCall(typeArg, keyArg) ?? base.VisitMethodCall(expression); } if (expression.IsMethod<IResolver, object>(resolver => resolver.Resolve<object>(), replaceGenericReturnType: true)) { // Resolve<T>() var genericType = expression.Type; return HandleMethodCall(genericType) ?? base.VisitMethodCall(expression); } if (expression.IsMethod<IResolver, object>(resolver => resolver.Resolve<object>((object)null), replaceGenericReturnType: true)) { // Resolve<T>(Key) var genericType = expression.Type; var keyArg = expression.GetMethodArgument<object>(0); return HandleMethodCall(genericType, keyArg) ?? base.VisitMethodCall(expression); } return base.VisitMethodCall(expression); }