/// <summary> /// Creates a DynamicString instance from the given expression. /// </summary> /// <param name="expression"> /// A string that have runtime resolved sections marked with the syntax "$(resolver-name)". /// For example: "The current time is $(get-current-time)". /// To specify a single literal '$' character in the expression, specify two '$' characters; that is, /// "$$". /// </param> /// <returns>The created DynamicString instance.</returns> public static DynamicString FromString(string expression) { if (expression == null) { throw new ArgumentNullException("expression"); } DynamicString newCfgString = new DynamicString(); int searchIdx = 0; int searchOffset = 0; while (searchIdx + searchOffset < expression.Length) { int dollarIdx = expression.IndexOf('$', searchIdx + searchOffset); if (dollarIdx == -1) { /// No more runtime sections, add the remaining part of the expression to the /// section list. newCfgString.sections.Add(expression.Substring(searchIdx).Replace("$$", "$")); newCfgString.runtimeFlags.Add(false); break; } else { /// Potentially runtime section found, we have to check it. if (expression.Length > dollarIdx + 1 && expression[dollarIdx + 1] == '$') { /// No, it's not a runtime section, just one simple '$' character escaped. searchOffset = dollarIdx + 2 - searchIdx; continue; } else if (expression.Length > dollarIdx + 1 && expression[dollarIdx + 1] == '(') { /// We have found the beginning of a runtime section, so we have to store the /// previous non-runtime section. if (dollarIdx - searchIdx > 0) { newCfgString.sections.Add( expression.Substring(searchIdx, dollarIdx - searchIdx).Replace("$$", "$")); newCfgString.runtimeFlags.Add(false); } /// Now parse the runtime section. int sectionEndIdx = expression.IndexOf(')', dollarIdx); if (sectionEndIdx != -1 && sectionEndIdx - dollarIdx > 2) { /// End of the runtime section has been found string runtimeSection = expression.Substring(dollarIdx + 2, sectionEndIdx - (dollarIdx + 2)); newCfgString.sections.Add(runtimeSection); newCfgString.runtimeFlags.Add(true); searchIdx = sectionEndIdx + 1; searchOffset = 0; } else { /// Syntax error throw new ConfigurationException(string.Format("Syntax error in DynamicString expression: {0}", expression)); } } else { /// Syntax error throw new ConfigurationException(string.Format("Syntax error in DynamicString expression: {0}", expression)); } } } return(newCfgString); }
/// <summary> /// Checks whether this DynamicString has the same value as the specified DynamicString. /// </summary> /// <param name="other">The DynamicString to test.</param> /// <returns>True if other DynamicString has the same value as this DynamicString.</returns> public bool Equals(DynamicString other) { return(other.Value == this.Value); }