public virtual IRPResultNode EvaluateElement(IRPResultNode resultNode, IEnumerable <IRPElement> elements) { if (!elements.Any()) { return(resultNode); } IRPElement element = elements.First(); if (!_rpElementRPResultNodeBuilderPairs.ContainsKey(element.GetType())) { throw new Exception($"{element.GetType()} does not have an associated RPResultNodeBuilder"); } Type rpResultNodeBuilderType = _rpElementRPResultNodeBuilderPairs[element.GetType()]; if (rpResultNodeBuilderType.GetMethod("EvaluateElement").DeclaringType == typeof(RPResultNodeBuilder)) { throw new Exception($"{rpResultNodeBuilderType} does not implement the EvaluateElement method."); } IRPResultNodeBuilder resultNodeBuilder = (IRPResultNodeBuilder)Activator.CreateInstance(rpResultNodeBuilderType); return(resultNodeBuilder.EvaluateElement(resultNode, elements)); }