public virtual void Configure(JObject obj) { IsDisabled = obj.Value <bool>(DisabledJsonPropertyName); var rvm = new ReflectionClassViewModel(this.GetType()); var properties = rvm.Properties .Where(p => p.HasAttribute <GeneratorConfigAttribute>() && p.HasSetter); foreach (var configProp in properties) { var propType = configProp.Type.TypeInfo; if (obj.TryGetValue(configProp.Name, StringComparison.OrdinalIgnoreCase, out JToken value)) { configProp.PropertyInfo.SetValue(this, value.ToObject(propType)); } } }
private void SearchHelper <T, TProp>( Expression <Func <T, TProp> > propSelector, string searchTerm, TProp searchCandidate, bool expectedMatch, TimeZoneInfo timeZoneInfo = null ) where T : new() { var classViewModel = new ReflectionClassViewModel(typeof(T)); var prop = classViewModel.PropertyBySelector(propSelector); var searchClauses = prop .SearchProperties(classViewModel, maxDepth: 1, force: true) .SelectMany(p => p.GetLinqDynamicSearchStatements( new ClaimsPrincipal(), timeZoneInfo ?? TimeZoneInfo.Local, "it", searchTerm )) .Select(t => t.statement) .ToList(); T model = new T(); prop.PropertyInfo.SetValue(model, searchCandidate); var matchedItems = searchClauses.Any() ? new[] { model } .AsQueryable() .Where(string.Join(" || ", searchClauses)) .ToArray() : new T[0]; if (expectedMatch) { Assert.True(matchedItems.Length == 1, $"{searchTerm} didn't match {searchCandidate}."); } else { Assert.False(matchedItems.Length == 1, $"{searchTerm} matched on {searchCandidate}, but shouldn't have."); } }