public static ITranslation GetTranslation(DynamicTranslationArgs args, Match match)
            {
                var subject    = args.Context.GetTranslationFor(args.FirstArgument);
                var memberName = match.Groups["MemberName"].Value;

                return(new MemberAccessTranslation(subject, memberName, args.ExpressionType, args.Context));
            }
            public static bool TryGetTranslation(DynamicTranslationArgs args, out ITranslation translation)
            {
                if (!args.IsMatch(_matcher, out var match))
                {
                    translation = null;
                    return(false);
                }

                var subjectObject      = args.FirstArgument;
                var subjectTranslation = args.Context.GetTranslationFor(subjectObject);
                var methodName         = match.Groups["MethodName"].Value;
                var methodInfo         = subjectObject.Type.GetPublicMethod(methodName);
                var methodArguments    = args.Arguments.Skip(1).ToArray();

                var method = GetMethod(
                    methodName,
                    methodInfo,
                    methodArguments,
                    args.ExpressionType);

                translation = MethodCallTranslation.ForDynamicMethodCall(
                    subjectTranslation,
                    method,
                    methodArguments,
                    args.Context);

                return(true);
            }
        public static ITranslation For(DynamicExpression dynamicExpression, ITranslationContext context)
        {
            var args = new DynamicTranslationArgs(dynamicExpression, context);

            if (DynamicMemberAccessTranslation.TryGetTranslation(args, out var translation))
            {
                return(translation);
            }

            if (DynamicMemberWriteTranslation.TryGetTranslation(args, out translation))
            {
                return(translation);
            }

            if (DynamicMethodCallTranslation.TryGetTranslation(args, out translation))
            {
                return(translation);
            }

            return(new FixedValueTranslation(
                       ExpressionType.Dynamic,
                       args.OperationDescription,
                       dynamicExpression.Type,
                       TokenType.Default,
                       context));
        }
            public static bool TryGetTranslation(DynamicTranslationArgs args, out ITranslation translation)
            {
                if (!args.IsMatch(_matcher, out var match))
                {
                    translation = null;
                    return(false);
                }

                translation = GetTranslation(args, match);
                return(true);
            }
            public static bool TryGetTranslation(DynamicTranslationArgs args, out ITranslation translation)
            {
                if (!args.IsMatch(_matcher, out var match))
                {
                    translation = null;
                    return(false);
                }

                var targetTranslation = DynamicMemberAccessTranslation.GetTranslation(args, match);

                translation = new AssignmentTranslation(
                    ExpressionType.Assign,
                    targetTranslation,
                    args.LastArgument,
                    args.Context);

                return(true);
            }