WIP
DirectOutput framework for virtual pinball cabinets WIP
Go to:
Overview 
TypeDocuData.cs
Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Reflection;
6 using System.Collections;
7 using System.IO;
8 using System.Xml.Serialization;
10 
11 namespace DocumentationHelper
12 {
13  public class TypeDocuData
14  {
15 
16  private Type _Type;
17 
18  public Type Type
19  {
20  get { return _Type; }
21  set { _Type = value; }
22  }
23 
24 
25  public string Summary
26  {
27  get
28  {
29  string N = "{0}.{1}".Build(Type.Namespace, Type.Name);
30  if (VSXmlDocu.TypeSummary.ContainsKey(N))
31  {
32  return VSXmlDocu.TypeSummary[N];
33  }
34  return "";
35  }
36  }
37 
38 
39  public string GetDocu()
40  {
41  string S = "";
42 
43 
44 
45  S += "\\section use_{0}_{1} {1}\n\n".Build(NamespaceName.Replace(".", "_"), Name);
46 
47  if (!Summary.IsNullOrWhiteSpace())
48  {
49  S += "\\subsection use_{0}_{1}_summary Summary\n\n".Build(NamespaceName.Replace(".", "_"), Name);
50  S += Summary;
51  S += "\n\n";
52  }
53 
54  string Xml = GetSampleXML();
55  if (!Xml.IsNullOrWhiteSpace())
56  {
57  S += "\\subsection use_{0}_{1}_samplexml Sample XML\n\n".Build(NamespaceName.Replace(".", "_"), Name);
58  S += "A configuration section for {0} might resemble the following structure:\n\n".Build(Name);
59  S += "~~~~~~~~~~~~~{.xml}\n";
60  S += Xml;
61  S += "\n~~~~~~~~~~~~~\n";
62  }
63 
64  List<PropertyDocuData> PDL = GetPropertyDocuDataList();
65  PDL.Sort((PDD1, PDD2) => PDD1.Name.CompareTo(PDD2.Name));
66  if (PDL.Count > 0)
67  {
68  S += "\\subsection use_{0}_{1}_properties Properties\n\n".Build(NamespaceName.Replace(".", "_"), Name);
69  S += "{0} has the following {1} configurable properties:\n\n".Build(Name, PDL.Count);
70  foreach (PropertyDocuData PDD in PDL)
71  {
72  S += PDD.GetDocu();
73  }
74 
75  }
76 
77 
78  return S;
79 
80 
81 
82  }
83 
84 
85 
86  public string Name { get { return Type.Name; } }
87 
88  public string NamespaceName { get { return Type.Namespace; } }
89 
90 
91 
92 
93  public string GetSampleXML()
94  {
95  object O = GetSampleReferenceType(Type);
96 
97  string Xml = "";
98  try
99  {
100  using (MemoryStream ms = new MemoryStream())
101  {
102 
103  XmlSerializerNamespaces Namespaces = new XmlSerializerNamespaces();
104  Namespaces.Add(string.Empty, string.Empty);
105  new XmlSerializer(Type).Serialize(ms, O, Namespaces);
106  ms.Position = 0;
107  using (StreamReader sr = new StreamReader(ms, Encoding.Default))
108  {
109  Xml = sr.ReadToEnd();
110  sr.Dispose();
111  }
112  }
113 
114  Xml = Xml.Substring(Xml.IndexOf("\n") + 1);
115  }
116  catch { }
117 
118  return Xml;
119 
120  }
121 
122  public List<PropertyDocuData> GetPropertyDocuDataList()
123  {
124  List<PropertyDocuData> L = new List<PropertyDocuData>();
125  foreach (PropertyInfo PI in Type.GetXMLSerializableProperties())
126  {
127  L.Add(new PropertyDocuData() { PropertyInfo = PI });
128  }
129  return L;
130  }
131 
132 
133 
134 
135 
136 
137 
138 
139  private object GetSampleReferenceType(Type RefType)
140  {
141  Type T = RefType;
142  if (T.IsInterface)
143  {
144  DirectOutput.General.TypeList Types = new DirectOutput.General.TypeList(AppDomain.CurrentDomain.GetAssemblies().ToList().SelectMany(s => s.GetTypes()).Where(p => T.IsAssignableFrom(p) && !p.IsAbstract));
145  if (Types.Count > 0)
146  {
147  T = Types[0];
148  }
149  else
150  {
151  return null;
152  }
153  }
154 
155 
156  Object O = Activator.CreateInstance(T);
157 
158 
159  foreach (PropertyInfo PI in O.GetType().GetXMLSerializableProperties())
160  {
161  if (PI.PropertyType.IsGenericList())
162  {
163 
164  IList EN = GetSampleGenericList(PI.PropertyType);
165  PI.SetValue(O, EN, null);
166  }
167  else if (PI.PropertyType == typeof(string))
168  {
169 
170  if (PI.ReflectedType.IsGenericList())
171  {
172  PI.ReflectedType.GetMethod("Add").Invoke(O, new[] { "Item" });
173  PI.ReflectedType.GetMethod("Add").Invoke(O, new[] { "Item" });
174  }
175  else
176  {
177  string V = (string)PI.GetValue(O, null);
178 
179 
180  if (V.IsNullOrWhiteSpace())
181  {
182  if (PI.Name.ToUpper() == "NAME")
183  {
184  PI.SetValue(O, "Name of {0}".Build(O.GetType().Name), null);
185  }
186  else if (PI.Name.ToUpper().EndsWith("NAME"))
187  {
188  PI.SetValue(O, "Name of {0}".Build(PI.Name.Substring(0, PI.Name.Length - 4)), null);
189  }
190  else
191  {
192  PI.SetValue(O, "{0} string".Build(PI.Name), null);
193  }
194  }
195  }
196  }
197  else if (PI.PropertyType.IsArray)
198  {
199  object A = PI.GetValue(O, null);
200  if (A == null)
201  {
202  object[] SampleArray = GetSampleArray(PI.PropertyType);
203  PI.SetValue(O, SampleArray, null);
204  }
205  }
206 
207  else if (typeof(IDictionary).IsAssignableFrom(PI.PropertyType) && PI.PropertyType.IsGenericType)
208  {
209  IDictionary EN = GetSampleGenericDictionary(PI.PropertyType);
210  PI.SetValue(O, EN, null);
211  }
212  else if (PI.PropertyType.IsValueType)
213  {
214  if (PI.PropertyType == typeof(char))
215  {
216  PI.SetValue(O, GetSampleValueType(PI.PropertyType), null);
217  }
218  }
219  else if (PI.PropertyType == typeof(DateTime))
220  {
221  PI.SetValue(O, DateTime.Now, null);
222  }
223  else if (PI.PropertyType == typeof(TimeSpan))
224  {
225  PI.SetValue(O, TimeSpan.Zero, null);
226  }
227  else if (!PI.PropertyType.IsValueType)
228  {
229  PI.SetValue(O, GetSampleReferenceType(PI.PropertyType), null);
230  }
231  else
232  {
233  throw new Exception("Unknow type {0}".Build(PI.PropertyType.Name));
234  }
235 
236  }
237  return O;
238 
239  }
240 
241  private object[] GetSampleArray(System.Type type)
242  {
243 
244 
245 
246  object[] A = (object[])Array.CreateInstance(typeof(object), 3);
247 
248  Type GT = type.GetElementType();
249  object G;
250  for (int i = 0; i < 3; i++)
251  {
252 
253  if (GT.IsValueType)
254  {
255  G = GetSampleValueType(GT);
256  }
257  else
258  {
259  G = GetSampleReferenceType(GT);
260  }
261  A[i] = G;
262  }
263 
264 
265  return A;
266  }
267 
268 
269 
270 
271 
272 
273  private IDictionary GetSampleGenericDictionary(System.Type T)
274  {
275  if (!(typeof(IDictionary).IsAssignableFrom(T) && T.IsGenericType)) return null;
276  IDictionary C = (IDictionary)Activator.CreateInstance(T);
277  if (T.GetGenericArguments().Length == 2)
278  {
279  Type KT = T.GetGenericArguments()[0];
280  Type VT = T.GetGenericArguments()[1];
281  object K;
282  object V;
283  for (int i = 0; i < 3; i++)
284  {
285  if (KT == typeof(string))
286  {
287  K = "Key {0}".Build(i);
288  }
289  else if (KT.IsValueType)
290  {
291  K = GetSampleValueType(KT);
292  if (KT.IsNumber())
293  {
294  K = Convert.ChangeType(i, KT);
295  }
296  }
297  else
298  {
299  K = GetSampleReferenceType(KT);
300  }
301  if (VT == typeof(string))
302  {
303  V = "Value {0}".Build(i);
304  }
305  else if (KT.IsValueType)
306  {
307  V = GetSampleValueType(KT);
308  if (KT.IsNumber())
309  {
310  K = Convert.ChangeType(i, KT);
311  }
312  }
313  else
314  {
315  V = GetSampleReferenceType(KT);
316  }
317  C.Add(K, V);
318 
319  }
320  }
321  return C;
322  }
323 
324 
325 
326 
327 
328  private IList GetSampleGenericList(Type T)
329  {
330  if (!(typeof(IList).IsAssignableFrom(T))) return null;
331  IList C = (IList)Activator.CreateInstance(T);
332 
333  //if (T.GetGenericArguments().Length == 1)
334  {
335  object G;
336  Type GT = T.GetGetGenericCollectionTypeArguments()[0];
337 
338  for (int i = 0; i < 3; i++)
339  {
340 
341  if (GT.IsValueType)
342  {
343  G = GetSampleValueType(GT);
344  }
345  else
346  {
347  G = GetSampleReferenceType(GT);
348  }
349  C.Add(G);
350  }
351  }
352 
353  return C;
354  }
355 
356  private object GetSampleValueType(Type T)
357  {
358  if (!T.IsValueType) return null;
359 
360  object O = Activator.CreateInstance(T);
361  if (T == typeof(char))
362  {
363  O = '?';
364  }
365 
366  return O;
367  }
368 
369 
370  }
371 }
List< PropertyDocuData > GetPropertyDocuDataList()
List for Type objects.
Definition: TypeList.cs:10
The namespace DirectOutput.General contains classes for general use.