Inheritance: AstExpression
        private Expression ReduceBaseMemberAccess(Base expression) {
            Delegate @delegate = null;
            MethodInfo methodInfo = null;
            ILGenerator ilGenerator = null;
            DynamicMethod dynamicMethod = null;
            Type delegateType = typeof(Func<,>);
            var expressionType = expression.Type;
            MethodDefinition methodDefinition = null;
            var propertyReference = _memberReferenceExpression.Annotation<PropertyDefinition>();

            methodDefinition = propertyReference.GetMethod;
            methodInfo = methodDefinition.GetActualMethod<MethodInfo>();
            dynamicMethod = new DynamicMethod(string.Format("Base_{0}", methodInfo.Name), methodInfo.ReturnType, new Type[] { expressionType }, expressionType);
            ilGenerator = dynamicMethod.GetILGenerator();
            ilGenerator.Emit(OpCodes.Ldarg_0);
            ilGenerator.EmitCall(OpCodes.Call, methodInfo, null);
            ilGenerator.Emit(OpCodes.Ret);
            delegateType = delegateType.MakeGenericType(expressionType, methodInfo.ReturnType);
            @delegate = dynamicMethod.CreateDelegate(delegateType);

            return AstExpression.Invoke(
                        AstExpression.Constant(@delegate),
                            Expression);
        }
        private Expression ReduceBaseAssignment(Base expression) {
            Type returnType = null;
            Delegate @delegate = null;
            MethodInfo methodInfo = null;
            ILGenerator ilGenerator = null;
            DynamicMethod dynamicMethod = null;
            Type delegateType = typeof(Func<,,>);
            MethodDefinition methodDefinition = null;
            var expressionType = expression.Type;
            ParameterExpression assignedValue = null;
            var propertyReference = _memberReferenceExpression.Annotation<PropertyDefinition>();

            methodDefinition = propertyReference.GetMethod;
            methodInfo = methodDefinition.GetActualMethod<MethodInfo>();
            returnType = InternalType = methodInfo.ReturnType;
            assignedValue = AstExpression.Parameter(returnType);
            methodDefinition = propertyReference.SetMethod;
            methodInfo = methodDefinition.GetActualMethod<MethodInfo>();

            dynamicMethod = new DynamicMethod(string.Format("Base_{0}", methodInfo.Name), returnType, new Type[] { expressionType, returnType }, expressionType);
            ilGenerator = dynamicMethod.GetILGenerator();
            ilGenerator.Emit(OpCodes.Ldarg_0);
            ilGenerator.Emit(OpCodes.Ldarg_1);
            ilGenerator.EmitCall(OpCodes.Call, methodInfo, null);
            ilGenerator.Emit(OpCodes.Ldarg_1);
            ilGenerator.Emit(OpCodes.Ret);

            delegateType = delegateType.MakeGenericType(expressionType, returnType, returnType);
            @delegate = dynamicMethod.CreateDelegate(delegateType);

            return AstExpression.Lambda(
                        AstExpression.GetFuncType(returnType, returnType),
                            AstExpression.Invoke(AstExpression.Constant(@delegate), Expression, assignedValue),
                                new ParameterExpression[] { assignedValue },
                                    ParentScope, Visitor);
        }
 protected internal Expression VisitBase(Base @base) {
     return @base.Update(@base.Context, @base.Type);
 }