private static void NotNullExpression(Attribute.Selector selector) { if (string.IsNullOrWhiteSpace(selector.Expression)) { throw new ArgumentException($"Expression of {selector} should not be null/empty"); } }
/// <summary> /// 构造方法 /// </summary> public Model() { var type = typeof(T); TypeName = type.FullName; var entitySelector = type.GetCustomAttributes(typeof(EntitySelector), true).FirstOrDefault() as EntitySelector; int take = 0; bool takeFromHead = true; Attribute.Selector selector = null; if (entitySelector != null) { take = entitySelector.Take; takeFromHead = entitySelector.TakeFromHead; selector = new Attribute.Selector { Expression = entitySelector.Expression, Type = entitySelector.Type }; } var followSelectors = type.GetCustomAttributes(typeof(FollowSelector), true).Select(x => (FollowSelector)x) .ToList(); var sharedValueSelectors = type.GetCustomAttributes(typeof(ValueSelector), true) .Select(x => (ValueSelector)x).ToList(); var properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public); var valueSelectors = new HashSet <ValueSelector>(); foreach (var property in properties) { var valueSelector = property.GetCustomAttributes(typeof(ValueSelector), true).FirstOrDefault() as ValueSelector; if (valueSelector == null) { continue; } if (string.IsNullOrWhiteSpace(valueSelector.Name)) { valueSelector.Name = property.Name; } valueSelector.Formatters = property.GetCustomAttributes(typeof(Formatter.Formatter), true) .Select(p => (Formatter.Formatter)p).ToArray(); valueSelector.PropertyInfo = property; valueSelector.NotNull = property.GetCustomAttributes(typeof(Required), false).Any(); valueSelectors.Add(valueSelector); } Selector = selector; ValueSelectors = valueSelectors; FollowSelectors = new HashSet <FollowSelector>(followSelectors); ShareValueSelectors = new HashSet <ValueSelector>(sharedValueSelectors); Take = take; TakeFromHead = takeFromHead; }
/// <summary> /// 把 BaseSelector 转换成真正的查询器 /// </summary> /// <param name="selector">BaseSelector</param> /// <returns>查询器</returns> public static ISelector ToSelector(this Attribute.Selector selector) { if (selector != null) { var expression = selector.Expression; switch (selector.Type) { case SelectorType.Css: { NotNullExpression(selector); return(Selectors.Css(expression)); } case SelectorType.JsonPath: { NotNullExpression(selector); return(Selectors.JsonPath(expression)); } case SelectorType.Regex: { NotNullExpression(selector); if (string.IsNullOrEmpty(selector.Arguments)) { return(Selectors.Regex(expression)); } if (int.TryParse(selector.Arguments, out var group)) { return(Selectors.Regex(expression, group)); } throw new ArgumentException($"Regex argument should be a number set to group: {selector}"); } case SelectorType.XPath: { NotNullExpression(selector); return(Selectors.XPath(expression)); } default: { throw new NotSupportedException($"{selector} unsupported"); } } } return(null); }