예제 #1
0
        static PerformerStatField()
        {
            var unsortedFields = new List<Cortege2<PerformerStatField, int>>();

            foreach (var prop in typeof(PerformerStatEx).GetProperties())
            {
                var title = string.Empty;
                var paramTitle = string.Empty;

                // title из ExpressionParameterNameAttribute имеет больший приоритет
                var attrs = prop.GetCustomAttributes(true);
                var exPtrAttr = attrs.FirstOrDefault(a => a is LocalizedExpressionParameterNameAttribute) as ExpressionParameterNameAttribute;
                if (exPtrAttr == null)
                    exPtrAttr = attrs.FirstOrDefault(a => a is ExpressionParameterNameAttribute) as ExpressionParameterNameAttribute;
                if (exPtrAttr != null)
                    paramTitle = exPtrAttr.ParamTitle;
                var dispNameAttr = attrs.FirstOrDefault(a => a is LocalizedDisplayNameAttribute) as DisplayNameAttribute;
                if (dispNameAttr == null)
                    dispNameAttr = attrs.FirstOrDefault(a => a is DisplayNameAttribute) as DisplayNameAttribute;
                if (dispNameAttr != null)
                    title = dispNameAttr.DisplayName;

                if (string.IsNullOrEmpty(title))
                    continue;

                var record = new PerformerStatField { Title = title, PropertyName = prop.Name };
                if (exPtrAttr != null)
                {
                    record.ExpressionParamName = exPtrAttr.ParamName;
                    record.ExpressionParamTitle = string.IsNullOrEmpty(paramTitle) ? title : paramTitle;
                    record.FieldType = exPtrAttr.FieldType;
                    record.FormatSuffix = exPtrAttr.Suffix;
                    record.DefaultSortOrder = exPtrAttr.DefaultSortOrder;
                }

                var formatAttr = attrs.FirstOrDefault(a => a is DisplayFormatAttribute) as DisplayFormatAttribute;
                if (formatAttr != null)
                    record.FormatString = formatAttr.DataFormatString;

                var descrAttr = attrs.FirstOrDefault(a => a is DescriptionAttribute) as DescriptionAttribute;
                if (descrAttr != null)
                    record.Description = descrAttr.Description;

                var defaultAttr = attrs.FirstOrDefault(a => a is DefaultExpressionValuesAttribute) as DefaultExpressionValuesAttribute;
                if (defaultAttr != null)
                {
                    record.DefaultOperator = defaultAttr.Operator;
                    record.DefaultValue = defaultAttr.Value;
                }

                var sortOrder = int.MaxValue;
                var sortAttr = attrs.FirstOrDefault(a => a is PropertyOrderAttribute) as PropertyOrderAttribute;
                if (sortAttr != null)
                    sortOrder = sortAttr.Order;

                unsortedFields.Add(new Cortege2<PerformerStatField, int>(record, sortOrder));
            }

            fields = unsortedFields.OrderBy(f => f.b).Select(f => f.a).ToList();
        }
예제 #2
0
        static PerformerStatField()
        {
            var unsortedFields = new List <Cortege2 <PerformerStatField, int> >();

            foreach (var prop in typeof(PerformerStatEx).GetProperties())
            {
                var title      = string.Empty;
                var paramTitle = string.Empty;

                // title из ExpressionParameterNameAttribute имеет больший приоритет
                var attrs     = prop.GetCustomAttributes(true);
                var exPtrAttr = attrs.FirstOrDefault(a => a is LocalizedExpressionParameterNameAttribute) as ExpressionParameterNameAttribute;
                if (exPtrAttr == null)
                {
                    exPtrAttr = attrs.FirstOrDefault(a => a is ExpressionParameterNameAttribute) as ExpressionParameterNameAttribute;
                }
                if (exPtrAttr != null)
                {
                    paramTitle = exPtrAttr.ParamTitle;
                }
                var dispNameAttr = attrs.FirstOrDefault(a => a is LocalizedDisplayNameAttribute) as DisplayNameAttribute;
                if (dispNameAttr == null)
                {
                    dispNameAttr = attrs.FirstOrDefault(a => a is DisplayNameAttribute) as DisplayNameAttribute;
                }
                if (dispNameAttr != null)
                {
                    title = dispNameAttr.DisplayName;
                }

                if (string.IsNullOrEmpty(title))
                {
                    continue;
                }

                var record = new PerformerStatField {
                    Title = title, PropertyName = prop.Name
                };
                if (exPtrAttr != null)
                {
                    record.ExpressionParamName  = exPtrAttr.ParamName;
                    record.ExpressionParamTitle = string.IsNullOrEmpty(paramTitle) ? title : paramTitle;
                    record.FieldType            = exPtrAttr.FieldType;
                    record.FormatSuffix         = exPtrAttr.Suffix;
                    record.DefaultSortOrder     = exPtrAttr.DefaultSortOrder;
                }

                var formatAttr = attrs.FirstOrDefault(a => a is DisplayFormatAttribute) as DisplayFormatAttribute;
                if (formatAttr != null)
                {
                    record.FormatString = formatAttr.DataFormatString;
                }

                var descrAttr = attrs.FirstOrDefault(a => a is DescriptionAttribute) as DescriptionAttribute;
                if (descrAttr != null)
                {
                    record.Description = descrAttr.Description;
                }

                var defaultAttr = attrs.FirstOrDefault(a => a is DefaultExpressionValuesAttribute) as DefaultExpressionValuesAttribute;
                if (defaultAttr != null)
                {
                    record.DefaultOperator = defaultAttr.Operator;
                    record.DefaultValue    = defaultAttr.Value;
                }

                var sortOrder = int.MaxValue;
                var sortAttr  = attrs.FirstOrDefault(a => a is PropertyOrderAttribute) as PropertyOrderAttribute;
                if (sortAttr != null)
                {
                    sortOrder = sortAttr.Order;
                }

                unsortedFields.Add(new Cortege2 <PerformerStatField, int>(record, sortOrder));
            }

            fields = unsortedFields.OrderBy(f => f.b).Select(f => f.a).ToList();
        }
예제 #3
0
        public static bool ParseSimpleFormula(string expression,
                                              out List <Cortege3 <PerformerStatField, ExpressionOperator, double> > filters,
                                              out PerformerStatField sortField)
        {
            ExpressionResolver resv;

            filters   = new List <Cortege3 <PerformerStatField, ExpressionOperator, double> >();
            sortField = null;
            try
            {
                resv = new ExpressionResolver(expression);
            }
            catch
            {
                return(false);
            }

            // одно из поддеревьев должно быть листом - PerformerStatField
            if (resv.rootOperand == null)
            {
                return(false);
            }
            if (resv.rootOperand.OperandLeft == null &&
                resv.rootOperand.OperandRight == null)
            {
                // частный случай - формула вида "1", "AYP" ...
                var sortVal = resv.rootOperand.IsConstant
                    ? resv.rootOperand.ConstantValue.ToStringUniform() : resv.rootOperand.VariableName;
                sortField = fields.FirstOrDefault(f => f.ExpressionParamName != null &&
                                                  f.ExpressionParamName.Equals(sortVal, StringComparison.OrdinalIgnoreCase));
                return(sortField != null);
            }

            if (resv.rootOperand.OperandLeft == null ||
                resv.rootOperand.OperandRight == null)
            {
                filters = null;
                return(false);
            }

            var root   = resv.rootOperand.OperandRight;
            var sorter = resv.rootOperand.OperandLeft;

            if (!sorter.IsVariable)
            {
                sorter = resv.rootOperand.OperandRight;
                root   = resv.rootOperand.OperandLeft;
            }
            if (!sorter.IsVariable)
            {
                filters = null;
                return(false);
            }
            sortField = fields.FirstOrDefault(f => f.ExpressionParamName != null &&
                                              f.ExpressionParamName.Equals(sorter.VariableName, StringComparison.OrdinalIgnoreCase));
            if (sortField == null)
            {
                filters = null;
                return(false);
            }

            // разобрать другое поддерево (root)
            if (root.IsConstant || root.IsVariable)
            {
                filters   = null;
                sortField = null;
                return(false);
            }
            return(ParseSimpleFormulaBranch(root, filters));
        }
예제 #4
0
        public static bool ParseSimpleFormula(string expression,
                                              out List<Cortege3<PerformerStatField, ExpressionOperator, double>> filters,
                                              out PerformerStatField sortField)
        {
            ExpressionResolver resv;
            filters = new List<Cortege3<PerformerStatField, ExpressionOperator, double>>();
            sortField = null;
            try
            {
                resv = new ExpressionResolver(expression);
            }
            catch
            {
                return false;
            }

            // одно из поддеревьев должно быть листом - PerformerStatField
            if (resv.rootOperand == null) return false;
            if (resv.rootOperand.OperandLeft == null &&
                resv.rootOperand.OperandRight == null)
            {
                // частный случай - формула вида "1", "AYP" ...
                var sortVal = resv.rootOperand.IsConstant
                    ? resv.rootOperand.ConstantValue.ToStringUniform() : resv.rootOperand.VariableName;
                sortField = fields.FirstOrDefault(f => f.ExpressionParamName != null &&
                    f.ExpressionParamName.Equals(sortVal, StringComparison.OrdinalIgnoreCase));
                return sortField != null;
            }

            if (resv.rootOperand.OperandLeft == null ||
                resv.rootOperand.OperandRight == null)
            {
                filters = null;
                return false;
            }

            var root = resv.rootOperand.OperandRight;
            var sorter = resv.rootOperand.OperandLeft;
            if (!sorter.IsVariable)
            {
                sorter = resv.rootOperand.OperandRight;
                root = resv.rootOperand.OperandLeft;
            }
            if (!sorter.IsVariable)
            {
                filters = null;
                return false;
            }
            sortField = fields.FirstOrDefault(f => f.ExpressionParamName != null &&
                f.ExpressionParamName.Equals(sorter.VariableName, StringComparison.OrdinalIgnoreCase));
            if (sortField == null)
            {
                filters = null;
                return false;
            }

            // разобрать другое поддерево (root)
            if (root.IsConstant || root.IsVariable)
            {
                filters = null;
                sortField = null;
                return false;
            }
            return ParseSimpleFormulaBranch(root, filters);
        }