public static IQueryable <T> ApplyOrderBy <T>(this IQueryable <T> source,
                                                      string propertyName, string orderType = "asc")
        {
            var expression = PropertyAccesor <T> .Get(propertyName);

            if (expression == null)
            {
                return(source);
            }

            //Ordenar ascendentemente por defecto
            var type = nameof(Queryable.OrderBy);

            //Ordenar descendentemente si es otro valor
            if (!string.IsNullOrEmpty(orderType) && orderType == "desc")
            {
                type = nameof(Queryable.OrderByDescending);
            }

            MethodCallExpression resultExpression = Expression.Call(
                typeof(Queryable),
                type,
                new Type[] { typeof(T), expression.ReturnType },
                source.Expression,
                Expression.Quote(expression));

            return(source.Provider.CreateQuery <T>(resultExpression));
        }
        public static IQueryable <T> ApplyWhere <T>(this IQueryable <T> source, string propertyName,
                                                    object propertyValue)
        {
            var mba = PropertyAccesor <T> .Get(propertyName);

            if (mba == null)
            {
                return(source);
            }
            object value;

            try
            {
                value = Convert.ChangeType(propertyValue, mba.ReturnType);
            }
            catch (Exception ex)
            {
                return(source);
            }

            var eqe = Expression.Equal(
                mba.Body,
                Expression.Constant(value, mba.ReturnType));

            var expression = Expression.Lambda(eqe, mba.Parameters[0]);


            MethodCallExpression resultExpression = Expression.Call(
                null,
                GetMethodInfo(Queryable.Where, source, (Expression <Func <T, bool> >)null),
                new Expression[] { source.Expression, Expression.Quote(expression) });

            return(source.Provider.CreateQuery <T>(resultExpression));
        }
        private void GrabObjects()
        {
            if (toolBar != null)
            {
                return;
            }

            FieldAccesor toolBarAccesor = new FieldAccesor(propertyGrid, "toolBar");

            if (toolBarAccesor.IsValid)
            {
                toolBarAccesor.Get();
            }
            else
            {
                toolBarAccesor = new FieldAccesor(propertyGrid, "toolStrip");
                toolBarAccesor.Get();

                // for a toolstrip we have to "fix" the readonly stuff on the controls :(
                Control      strip        = toolBarAccesor.Value as Control;
                FieldAccesor readonlyFlag = new FieldAccesor(strip.Controls, "_isReadOnly");
                readonlyFlag.Set(false);
            }

            toolBar = toolBarAccesor.Value as Control;
            AttachNewToolButtons();

            FieldAccesor gridViewAccesor = new FieldAccesor(propertyGrid, "gridView");

            gridViewAccesor.Get();
            this.gridView = gridViewAccesor.Value;

            allGridItemsAC      = new FieldAccesor(gridView, "allGridEntries");
            topLevelGridItemsAC = new FieldAccesor(gridView, "topLevelGridEntries");

            totalProps  = new FieldAccesor(gridView, "totalProps");
            selectedRow = new FieldAccesor(gridView, "selectedRow");

            setScrollOffset = new MethodAccesor(gridView.GetType(), "SetScrollOffset");
            selectGridEntry = new PropertyAccesor(gridView, "SelectedGridEntry");
            layoutWindow    = new MethodAccesor(gridView.GetType(), "Refresh");

            propertyGrid.SelectedObjectsChanged += new EventHandler(propertyGrid_SelectedObjectsChanged);
            propertyGrid.PropertyTabChanged     += new PropertyTabChangedEventHandler(propertyGrid_PropertyTabChanged);
            propertyGrid.PropertySortChanged    += new EventHandler(propertyGrid_PropertySortChanged);
        }