namespace LaaProduction.Services.Models.Reports { using System; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Linq.Expressions; using System.Reflection; public static class ReportModelExtensions { public static ReportFilterProperty Text(this T model, Expression> expression, int index, int orderBy = 0) => model.Property(expression, index, PropertyType.Text, orderBy); public static ReportFilterProperty DateTime(this T model, Expression> expression, int index, int orderBy = 0) => model.Property(expression, index, PropertyType.Date, orderBy); public static ReportFilterProperty Boolean(this T model, Expression> expression, int index, int orderBy = 0) => model.Property(expression, index, PropertyType.Bool, orderBy); public static ReportFilterProperty Property(this T model, Expression> expression, int index, PropertyType propertyType, int orderBy) { var memberInfo = default(MemberInfo); if (expression.Body is MemberExpression memberExpression) { memberInfo = memberExpression.Member; } else if (expression.Body is UnaryExpression unaryExpression && unaryExpression.Operand is MemberExpression operandExpression) { memberInfo = operandExpression.Member; } return new ReportFilterProperty { Column = memberInfo?.GetCustomAttribute()?.Name, Property = memberInfo?.Name, OrderBy = orderBy, Index = index, Type = propertyType }; } public static string Display(Expression> expression) { var memberInfo = default(MemberInfo); if (expression.Body is MemberExpression memberExpression) { memberInfo = memberExpression.Member; } else if (expression.Body is UnaryExpression unaryExpression && unaryExpression.Operand is MemberExpression operandExpression) { memberInfo = operandExpression.Member; } return memberInfo ?.GetCustomAttribute() ?.Name; } } }