/// <summary> /// /// </summary> /// <param name="variableNames"></param> /// <param name="fetchAllVariables"></param> /// <returns></returns> public virtual IDictionary <string, object> GetVariables(IEnumerable <string> variableNames, bool fetchAllVariables) { IDictionary <string, object> requestedVariables = new Dictionary <string, object>(); ISet <string> variableNamesToFetch = new HashSet <string>(variableNames); // Transient variables 'shadow' any existing variables. // The values in the fetch-cache will be more recent, so they can override any existing ones foreach (string variableName in variableNames) { if (transientVariabes != null && transientVariabes.ContainsKey(variableName)) { requestedVariables[variableName] = transientVariabes[variableName].Value; variableNamesToFetch.Remove(variableName); } else if (usedVariablesCache.ContainsKey(variableName)) { requestedVariables[variableName] = usedVariablesCache[variableName].Value; variableNamesToFetch.Remove(variableName); } } if (fetchAllVariables) { // getVariables() will go up the execution hierarchy, no need to do // it here also, the cached values will already be applied too IDictionary <string, object> allVariables = Variables; foreach (string variableName in variableNamesToFetch) { requestedVariables[variableName] = allVariables[variableName]; } return(requestedVariables); } else { // Go up if needed IVariableScope parent = ParentVariableScope; if (parent != null) { requestedVariables.PutAll(parent.GetVariables(variableNamesToFetch, fetchAllVariables)); } // Fetch variables on this scope IList <IVariableInstanceEntity> variables = GetSpecificVariables(variableNamesToFetch); foreach (IVariableInstanceEntity variable in variables) { requestedVariables[variable.Name] = variable.Value; } return(requestedVariables); } }