Advertisement
Guest User

Untitled

a guest
Sep 25th, 2016
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.37 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Reflection;
  6.  
  7. namespace ObjectInitializerCodeGenerator
  8. {
  9. public class CodeGenerator
  10. {
  11.  
  12. private CodeGenerator()
  13. {
  14.  
  15. }
  16.  
  17. public static string GetFriendlyTypeName(Type type)
  18. {
  19. if (type.IsGenericParameter) { return type.Name; }
  20. if (!type.IsGenericType) { return type.FullName; }
  21. var builder = new System.Text.StringBuilder();
  22. var name = type.Name;
  23. var index = name.IndexOf("`");
  24. builder.AppendFormat("{0}.{1}", type.Namespace, name.Substring(0, index)); builder.Append('<');
  25. var first = true;
  26. foreach (var arg in type.GetGenericArguments())
  27. {
  28. if (!first) { builder.Append(','); }
  29. builder.Append(GetFriendlyTypeName(arg)); first = false;
  30. }
  31. builder.Append('>');
  32. return builder.ToString();
  33. }
  34.  
  35.  
  36. private string GenerateCodeInternal(object input)
  37. {
  38.  
  39. var variableType = input.GetType();
  40. var variableName = CreateVariableName(variableType);
  41. sb.Append("var ");
  42. sb.Append(variableName);
  43.  
  44. //TODO: better check
  45. if (variableType.IsClass && variableType != typeof(string))
  46. {
  47. sb.Append(" = new ");
  48. sb.Append(GetFriendlyTypeName(variableType));
  49. sb.AppendLine("();");
  50.  
  51. //if (variableType.GetInterfaces().Contains(typeof(System.Collections.IList)))
  52. var asList = input as System.Collections.IList;
  53. if (asList != null)
  54. {
  55. foreach (var element in asList)
  56. {
  57. var elementName = GenerateCodeInternal(element);
  58. sb.Append(variableName);
  59. sb.Append(".Add(");
  60. sb.Append(elementName);
  61. sb.AppendLine(");");
  62. }
  63. }
  64. else
  65. {
  66. foreach (PropertyInfo pi in variableType.GetProperties())
  67. {
  68. var propertyValue = pi.GetValue(input, null);
  69.  
  70. if (pi.PropertyType.IsValueType)
  71. {
  72. //if not default
  73. if (!object.Equals(Activator.CreateInstance(pi.PropertyType), propertyValue))
  74. {
  75. sb.Append(variableName);
  76. sb.Append(".");
  77. sb.Append(pi.Name);
  78. sb.Append(" = ");
  79. sb.Append(propertyValue); //does not work for Decimal
  80. sb.AppendLine(";");
  81. }
  82. }
  83. else
  84. {
  85. if (propertyValue != null)
  86. {
  87. if (pi.PropertyType == typeof(String))
  88. {
  89. sb.Append(variableName);
  90. sb.Append(".");
  91. sb.Append(pi.Name);
  92. sb.Append(" = \"");
  93. sb.Append(propertyValue);
  94. sb.AppendLine("\";");
  95. }
  96. //collection
  97.  
  98. else
  99. {
  100. //warn if no constructor
  101. if (pi.PropertyType.GetConstructor(System.Type.EmptyTypes) == null)
  102. sb.AppendLine("//Warning - no parameterless constructor. Will not compile");
  103.  
  104. //recurse
  105. var objectName = GenerateCodeInternal(propertyValue);
  106. sb.Append(variableName);
  107. sb.Append(".");
  108. sb.Append(pi.Name);
  109. sb.Append(" = ");
  110. sb.Append(objectName);
  111. sb.AppendLine(";");
  112.  
  113. }
  114. }
  115. }
  116. //
  117. //var propname = GenerateCodeInternal(pi.GetValue(input, null));
  118. }
  119. }
  120. }
  121. //else if (variableType.IsValueType)
  122. //{
  123. // sb.Append(" = ");
  124. // sb.Append(input);
  125. // sb.AppendLine(";");
  126. //}
  127.  
  128. return variableName;
  129. }
  130. const string spaces = " ";
  131.  
  132. private string GenerateObjectInitializerCodeInternal(object input, int indent = 0)
  133. {
  134. StringBuilder sb = new StringBuilder();
  135. var variableType = input.GetType();
  136.  
  137. if (variableType.IsValueType)
  138. {
  139. sb.Append(input.ToString()); //does not work for Decimal
  140. }
  141. else if (variableType == typeof(String))
  142. {
  143. sb.Append("\"");
  144. sb.Append(input.ToString());
  145. sb.Append("\"");
  146. }
  147. else if (variableType.IsClass)
  148. {
  149. sb.Append("new ");
  150. sb.Append(GetFriendlyTypeName(variableType));
  151.  
  152. //if (variableType.GetInterfaces().Contains(typeof(System.Collections.IList)))
  153. var list = input as System.Collections.IList;
  154. if (list != null)
  155. {
  156. sb.AppendLine("{");
  157. var listItems = new List<String>();
  158. foreach (object item in list)
  159. {
  160. listItems.Add(new String('\t', indent + 1) + GenerateObjectInitializerCodeInternal(item, indent + 1));
  161. }
  162. if (listItems.Count > 0)
  163. {
  164. sb.AppendLine(String.Join(", \n", listItems));
  165. }
  166. sb.Append(new String('\t', indent) + "}");
  167. }
  168. else
  169. {
  170. sb.Append("()");
  171.  
  172. var props = new List<String>();
  173. foreach (PropertyInfo pi in variableType.GetProperties())
  174. {
  175. if (pi.PropertyType.IsValueType)
  176. {
  177. var propertyValue = pi.GetValue(input, null);
  178. //if not default
  179. if (!object.Equals(Activator.CreateInstance(pi.PropertyType), propertyValue))
  180. {
  181. props.Add(new String('\t', indent + 1) + pi.Name + " = " + GenerateObjectInitializerCodeInternal(propertyValue, indent + 1));
  182. }
  183. }
  184. else
  185. {
  186. var propertyValue = pi.GetValue(input, null);
  187. if (propertyValue != null)
  188. {
  189. props.Add(new String('\t', indent + 1) + pi.Name + " = " + GenerateObjectInitializerCodeInternal(propertyValue, indent + 1));
  190.  
  191. }
  192. }
  193.  
  194. }
  195. if (props.Count > 0)
  196. {
  197. sb.AppendLine(" { ");
  198. sb.AppendLine(String.Join(", \n", props));
  199. sb.Append(new String('\t', indent) + "}");
  200. }
  201. }
  202. }
  203.  
  204. return sb.ToString();
  205. }
  206.  
  207.  
  208. StringBuilder sb = new StringBuilder();
  209.  
  210. public static string GenerateCode<T>(T input) where T : new()
  211. {
  212. CodeGenerator cg = new CodeGenerator();
  213. cg.GenerateCodeInternal(input);
  214. return cg.sb.ToString();
  215.  
  216. }
  217.  
  218. public static string GenerateObjectInitializerCode<T>(T input) where T : new()
  219. {
  220. CodeGenerator cg = new CodeGenerator();
  221. return cg.GenerateObjectInitializerCodeInternal(input);
  222. }
  223.  
  224. Dictionary<Type, int> variableNameCounter = new Dictionary<Type, int>();
  225. public string CreateVariableName(Type t)
  226. {
  227. if (!variableNameCounter.ContainsKey(t))
  228. {
  229. variableNameCounter.Add(t, 0);
  230. return t.Name.ToCamelCase() + "0";
  231. }
  232. else
  233. {
  234. var count = variableNameCounter[t]++;
  235. return t.Name.ToCamelCase() + count;
  236. }
  237. }
  238.  
  239. }
  240.  
  241. public static class Extentions
  242. {
  243. public static string ToCamelCase(this string input)
  244. {
  245. if (input == null) return null;
  246. if (input == String.Empty) return String.Empty;
  247. if (input.Length == 1) return input.ToLower();
  248. return Char.ToLower(input[0]).ToString() + input.Substring(1);
  249. }
  250. }
  251.  
  252. public class Formatter : IFormatProvider
  253. {
  254. public object GetFormat(Type formatType)
  255. {
  256. throw new NotImplementedException();
  257. }
  258. }
  259. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement