public void Add(string path, FormattedValidationResult validationResult) { var pieces = path.Split(new[] { '.' }, StringSplitOptions.RemoveEmptyEntries); var node = root; foreach (var edge in pieces) { if (node is ValidationResultTreeUniversalNode) { node = ((ValidationResultTreeUniversalNode)node).GotoChild(edge); } else if (node is ValidationResultTreeArrayNode) { node = ((ValidationResultTreeArrayNode)node).GotoChild(int.Parse(edge)); } else { var nodeType = node.GetType(); var field = nodeType.GetField(edge, BindingFlags.Instance | BindingFlags.Public); var child = (ValidationResultTreeNode)field.GetValue(node); if (child == null) { field.SetValue(node, child = ValidationResultTreeNodeBuilder.BuildFactory(field.FieldType, false)(node)); } node = child; } } node.ValidationResults.Add(validationResult); }
public Func <TChild, ValidationResultTreeNode> GetValidator <TChild>(Expression <Func <TData, TChild> > path) { var validator = GetValidatorInternal(path); var factory = ValidationResultTreeNodeBuilder.BuildFactory(typeof(TChild), true); return(child => { var tree = factory(null); validator(child, tree); return tree; }); }
public ValidationResultTreeNode() { root = ValidationResultTreeNodeBuilder.BuildFactory(typeof(T), true)(null); }