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(); }
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(); }
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)); }
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); }