DirectOutputR1
DirectOutput framework R1 for virtual pinball cabinets.
Go to:
Overview 
 All Classes Namespaces Files Functions Variables Enumerations Enumerator Properties Events Macros Pages
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;
9 using DirectOutput.General.Generic;
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 == typeof(string))
162  {
163  string V = (string)PI.GetValue(O, null);
164  if (V.IsNullOrWhiteSpace())
165  {
166  if (PI.Name.ToUpper() == "NAME")
167  {
168  PI.SetValue(O, "Name of {0}".Build(O.GetType().Name), null);
169  }
170  else if (PI.Name.ToUpper().EndsWith("NAME"))
171  {
172  PI.SetValue(O, "Name of {0}".Build(PI.Name.Substring(0, PI.Name.Length - 4)), null);
173  }
174  else
175  {
176  PI.SetValue(O, "{0} string".Build(PI.Name), null);
177  }
178  }
179  }
180  else if (PI.PropertyType.IsArray)
181  {
182  object A = PI.GetValue(O,null);
183  if (A == null)
184  {
185  object[] SampleArray = GetSampleArray(PI.PropertyType);
186  PI.SetValue(O, SampleArray, null);
187  }
188  }
189  else if (PI.PropertyType.IsGenericList())
190  {
191 
192  IList EN = GetSampleGenericList(PI.PropertyType);
193  PI.SetValue(O, EN, null);
194  }
195  else if (typeof(IDictionary).IsAssignableFrom(PI.PropertyType) && PI.PropertyType.IsGenericType)
196  {
197  IDictionary EN = GetSampleGenericDictionary(PI.PropertyType);
198  PI.SetValue(O, EN, null);
199  }
200  else if (PI.PropertyType.IsValueType)
201  {
202  if (PI.PropertyType == typeof(char))
203  {
204  PI.SetValue(O, GetSampleValueType(PI.PropertyType), null);
205  }
206  }
207  else if (PI.PropertyType == typeof(DateTime))
208  {
209  PI.SetValue(O, DateTime.Now, null);
210  }
211  else if (PI.PropertyType == typeof(TimeSpan))
212  {
213  PI.SetValue(O, TimeSpan.Zero, null);
214  }
215  else if (!PI.PropertyType.IsValueType)
216  {
217  PI.SetValue(O, GetSampleReferenceType(PI.PropertyType), null);
218  }
219  else
220  {
221  throw new Exception("Unknow type {0}".Build(PI.PropertyType.Name));
222  }
223 
224  }
225  return O;
226 
227  }
228 
229  private object[] GetSampleArray(System.Type type)
230  {
231 
232 
233 
234  object[] A = (object[])Array.CreateInstance(typeof(object),3);
235 
236  Type GT = type.GetElementType();
237  object G;
238  for (int i = 0; i < 3; i++)
239  {
240 
241  if (GT.IsValueType)
242  {
243  G = GetSampleValueType(GT);
244  }
245  else
246  {
247  G = GetSampleReferenceType(GT);
248  }
249  A[i]=G;
250  }
251 
252 
253  return A;
254  }
255 
256 
257 
258 
259 
260 
261  private IDictionary GetSampleGenericDictionary(System.Type T)
262  {
263  if (!(typeof(IDictionary).IsAssignableFrom(T) && T.IsGenericType)) return null;
264  IDictionary C = (IDictionary)Activator.CreateInstance(T);
265  if (T.GetGenericArguments().Length == 2)
266  {
267  Type KT = T.GetGenericArguments()[0];
268  Type VT = T.GetGenericArguments()[1];
269  object K;
270  object V;
271  for (int i = 0; i < 3; i++)
272  {
273  if (KT == typeof(string))
274  {
275  K = "Key {0}".Build(i);
276  }
277  else if (KT.IsValueType)
278  {
279  K = GetSampleValueType(KT);
280  if (KT.IsNumber())
281  {
282  K = Convert.ChangeType(i, KT);
283  }
284  }
285  else
286  {
287  K = GetSampleReferenceType(KT);
288  }
289  if (VT == typeof(string))
290  {
291  V = "Value {0}".Build(i);
292  }
293  else if (KT.IsValueType)
294  {
295  V = GetSampleValueType(KT);
296  if (KT.IsNumber())
297  {
298  K = Convert.ChangeType(i, KT);
299  }
300  }
301  else
302  {
303  V = GetSampleReferenceType(KT);
304  }
305  C.Add(K, V);
306 
307  }
308  }
309  return C;
310  }
311 
312 
313 
314 
315 
316  private IList GetSampleGenericList(Type T)
317  {
318  if (!(typeof(IList).IsAssignableFrom(T) )) return null;
319  IList C = (IList)Activator.CreateInstance(T);
320 
321  //if (T.GetGenericArguments().Length == 1)
322  {
323  object G;
324  Type GT = T.GetGetGenericCollectionTypeArguments()[0];
325 
326  for (int i = 0; i < 3; i++)
327  {
328 
329  if (GT.IsValueType)
330  {
331  G = GetSampleValueType(GT);
332  }
333  else
334  {
335  G = GetSampleReferenceType(GT);
336  }
337  C.Add(G);
338  }
339  }
340 
341  return C;
342  }
343 
344  private object GetSampleValueType(Type T)
345  {
346  if (!T.IsValueType) return null;
347 
348  object O = Activator.CreateInstance(T);
349  if (T == typeof(char))
350  {
351  O = '?';
352  }
353 
354  return O;
355  }
356 
357 
358  }
359 }