VariableSet.cs
上传用户:husern
上传日期:2022-03-24
资源大小:534k
文件大小:8k
源码类别:

编辑器/阅读器

开发平台:

C#

  1. // -- FILE ------------------------------------------------------------------
  2. // name       : IVariableSet.cs
  3. // project    : Itenso Web User Forms
  4. // created    : Jani Giannoudis - 2008.10.30
  5. // language   : c#
  6. // environment: .NET 2.0
  7. // copyright  : (c) 2008 by Itenso GmbH, Switzerland
  8. // --------------------------------------------------------------------------
  9. using System;
  10. using System.Text;
  11. using System.Reflection;
  12. using System.Globalization;
  13. using System.Collections.Generic;
  14. namespace Itenso.WebUserForms.Data.Variable
  15. {
  16. // ------------------------------------------------------------------------
  17. public enum ObjectMappingMode
  18. {
  19. AnyValue,
  20. DefinedValue,
  21. } // enum ObjectMappingMode
  22. // ------------------------------------------------------------------------
  23. public sealed class VariableSet : IVariableSet
  24. {
  25. // ----------------------------------------------------------------------
  26. public VariableSet()
  27. {
  28. } // VariableSet
  29. // ----------------------------------------------------------------------
  30. public int Count
  31. {
  32. get { return this.contentMap.Count; }
  33. } // Count
  34. // ----------------------------------------------------------------------
  35. public IEnumerable<string> VariableNames
  36. {
  37. get { return this.contentMap.Keys; }
  38. } // VariableNames
  39. // ----------------------------------------------------------------------
  40. public string this[ string variableName ] 
  41. {
  42. get { return this.contentMap[ variableName ]; }
  43. } // this[]
  44. // ----------------------------------------------------------------------
  45. public string GetVariableContent( string variableName )
  46. {
  47. return contentMap.ContainsKey( variableName ) ? this.contentMap[ variableName ] : null;
  48. } // GetVariableContent
  49. // ----------------------------------------------------------------------
  50. public void MapContentToVariable( string variableName, string content )
  51. {
  52. if ( string.IsNullOrEmpty( variableName ) )
  53. {
  54. throw new ArgumentNullException( "variableName" );
  55. }
  56. if ( content == null )
  57. {
  58. throw new ArgumentNullException( "content" );
  59. }
  60. if ( this.contentMap.ContainsKey( variableName ) )
  61. {
  62. this.contentMap[ variableName ] = content;
  63. }
  64. else
  65. {
  66. this.contentMap.Add( variableName, content );
  67. }
  68. } // MapContentToVariable
  69. // ----------------------------------------------------------------------
  70. public void MapObjectPropertiesToVariables( object variableObject )
  71. {
  72. MapObjectPropertiesToVariables( variableObject, ObjectMappingMode.AnyValue );
  73. } // MapObjectPropertiesToVariables
  74. // ----------------------------------------------------------------------
  75. public void MapObjectPropertiesToVariables( object variableObject, ObjectMappingMode objectMappingMode )
  76. {
  77. if ( variableObject == null )
  78. {
  79. throw new ArgumentNullException( "variableObject" );
  80. }
  81. PropertyInfo[] propertyInfos = variableObject.GetType().GetProperties(
  82. BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic );
  83. foreach ( PropertyInfo propertyInfo in propertyInfos )
  84. {
  85. if ( propertyInfo.PropertyType == null || propertyInfo.PropertyType.BaseType == null )
  86. {
  87. continue; // do not allow classes and interfaces
  88. }
  89. object variableValue = propertyInfo.GetValue( variableObject, null );
  90. if ( objectMappingMode == ObjectMappingMode.DefinedValue && variableValue == null )
  91. {
  92. continue;
  93. }
  94. if ( variableValue == null )
  95. {
  96. variableValue = string.Empty;
  97. }
  98. MapContentToVariable( propertyInfo.Name, variableValue.ToString() );
  99. }
  100. } // MapObjectPropertiesToVariables
  101. // ----------------------------------------------------------------------
  102. public void RemoveVariable( string variableName )
  103. {
  104. if ( string.IsNullOrEmpty( variableName ) )
  105. {
  106. throw new ArgumentNullException( "variableName" );
  107. }
  108. this.contentMap.Remove( variableName );
  109. } // RemoveVariable
  110. // ----------------------------------------------------------------------
  111. public string Expand( string textToExpand )
  112. {
  113. StringBuilder output = new StringBuilder();
  114. ExpandVariablesRecursive( textToExpand, startDelimiter, endDelimiter, new Stack<string>(), output );
  115. return output.ToString();
  116. } // Expand
  117. // ----------------------------------------------------------------------
  118. public void Clear()
  119. {
  120. this.contentMap.Clear();
  121. } // Clear
  122. // ----------------------------------------------------------------------
  123. public void CopyTo( IVariableSet destination )
  124. {
  125. CopyTo( destination, null );
  126. } // CopyTo
  127. // ----------------------------------------------------------------------
  128. public void CopyTo( IVariableSet destination, string nameFormat )
  129. {
  130. if ( destination == null )
  131. {
  132. throw new ArgumentNullException( "destination" );
  133. }
  134. foreach ( string variableName in VariableNames )
  135. {
  136. string destinationVariableName = variableName;
  137. if ( !string.IsNullOrEmpty( nameFormat ) )
  138. {
  139. destinationVariableName = string.Format(
  140. CultureInfo.InvariantCulture,
  141. nameFormat,
  142. destinationVariableName );
  143. }
  144. destination.MapContentToVariable( destinationVariableName, this[ variableName ] );
  145. }
  146. } // CopyTo
  147. // ----------------------------------------------------------------------
  148. private void ExpandVariablesRecursive(
  149. string textToExpand,
  150. string variablePrefix,
  151. string variablePostfix,
  152. Stack<string> replacementStack,
  153. StringBuilder output
  154. )
  155. {
  156. if ( !string.IsNullOrEmpty( textToExpand ) )
  157. {
  158. int remainderBegin = 0;
  159. int totalLen = textToExpand.Length;
  160. int varPrefixLen = variablePrefix.Length;
  161. int varStartPos = textToExpand.IndexOf( variablePrefix );
  162. while ( varStartPos >= remainderBegin )
  163. {
  164. if ( remainderBegin < varStartPos )
  165. {
  166. output.Append( textToExpand.Substring( remainderBegin, varStartPos - remainderBegin ) );
  167. remainderBegin = varStartPos;
  168. }
  169. int varNameBegin = varStartPos + varPrefixLen;
  170. int varEndPos = textToExpand.IndexOf( variablePostfix, varNameBegin );
  171. int nextSearchBegin = varEndPos + variablePostfix.Length;
  172. if ( varEndPos >= varNameBegin )
  173. {
  174. int varNameLen = varEndPos - varNameBegin;
  175. string variableName = textToExpand.Substring( varNameBegin, varNameLen );
  176. string replacement = GetVariableContent( variableName );
  177. if ( replacement != null )
  178. {
  179. if ( replacementStack.Contains( variableName ) )
  180. {
  181. }
  182. else
  183. {
  184. replacementStack.Push( variableName );
  185. ExpandVariablesRecursive( replacement, variablePrefix, variablePostfix, replacementStack, output );
  186. replacementStack.Pop();
  187. remainderBegin = nextSearchBegin;
  188. }
  189. }
  190. else
  191. {
  192. nextSearchBegin = varStartPos + 1;
  193. }
  194. }
  195. else
  196. {
  197. break;
  198. }
  199. varStartPos = textToExpand.IndexOf( variablePrefix, nextSearchBegin );
  200. }
  201. if ( remainderBegin < totalLen )
  202. {
  203. output.Append( textToExpand.Substring( remainderBegin ) );
  204. }
  205. }
  206. } // ExpandVariablesRecursive
  207. // ----------------------------------------------------------------------
  208. // members
  209. private readonly SortedDictionary<string, string> contentMap = new SortedDictionary<string, string>();
  210. private const string startDelimiter = "${";
  211. private const string endDelimiter = "}";
  212. } // class VariableSet
  213. } // namespace Itenso.WebUserForms.Data.Variable
  214. // -- EOF -------------------------------------------------------------------