2 using System.Collections.Generic;
4 #if ES_BUILD_STANDALONE
5 namespace Microsoft.Diagnostics.Tracing
7 namespace System.Diagnostics.Tracing
13 /// TraceLogging: Type handler for empty or unsupported types.
15 /// <typeparam name="DataType">The type to handle.</typeparam>
16 internal sealed class NullTypeInfo<DataType>
17 : TraceLoggingTypeInfo<DataType>
19 public override void WriteMetadata(
20 TraceLoggingMetadataCollector collector,
22 EventFieldFormat format)
24 collector.AddGroup(name);
27 public override void WriteData(TraceLoggingDataCollector collector, ref DataType value)
32 public override object GetData(object value)
40 #region Primitive scalars
43 /// TraceLogging: Type handler for Boolean.
45 internal sealed class BooleanTypeInfo
46 : TraceLoggingTypeInfo<Boolean>
48 public override void WriteMetadata(
49 TraceLoggingMetadataCollector collector,
51 EventFieldFormat format)
53 collector.AddScalar(name, Statics.Format8(format, TraceLoggingDataType.Boolean8));
56 public override void WriteData(TraceLoggingDataCollector collector, ref Boolean value)
58 collector.AddScalar(value);
63 /// TraceLogging: Type handler for Byte.
65 internal sealed class ByteTypeInfo
66 : TraceLoggingTypeInfo<Byte>
68 public override void WriteMetadata(
69 TraceLoggingMetadataCollector collector,
71 EventFieldFormat format)
73 collector.AddScalar(name, Statics.Format8(format, TraceLoggingDataType.UInt8));
76 public override void WriteData(TraceLoggingDataCollector collector, ref Byte value)
78 collector.AddScalar(value);
83 /// TraceLogging: Type handler for SByte.
85 internal sealed class SByteTypeInfo
86 : TraceLoggingTypeInfo<SByte>
88 public override void WriteMetadata(
89 TraceLoggingMetadataCollector collector,
91 EventFieldFormat format)
93 collector.AddScalar(name, Statics.Format8(format, TraceLoggingDataType.Int8));
96 public override void WriteData(TraceLoggingDataCollector collector, ref SByte value)
98 collector.AddScalar(value);
103 /// TraceLogging: Type handler for Int16.
105 internal sealed class Int16TypeInfo
106 : TraceLoggingTypeInfo<Int16>
108 public override void WriteMetadata(
109 TraceLoggingMetadataCollector collector,
111 EventFieldFormat format)
113 collector.AddScalar(name, Statics.Format16(format, TraceLoggingDataType.Int16));
116 public override void WriteData(TraceLoggingDataCollector collector, ref Int16 value)
118 collector.AddScalar(value);
123 /// TraceLogging: Type handler for UInt16.
125 internal sealed class UInt16TypeInfo
126 : TraceLoggingTypeInfo<UInt16>
128 public override void WriteMetadata(
129 TraceLoggingMetadataCollector collector,
131 EventFieldFormat format)
133 collector.AddScalar(name, Statics.Format16(format, TraceLoggingDataType.UInt16));
136 public override void WriteData(TraceLoggingDataCollector collector, ref UInt16 value)
138 collector.AddScalar(value);
143 /// TraceLogging: Type handler for Int32.
145 internal sealed class Int32TypeInfo
146 : TraceLoggingTypeInfo<Int32>
148 public override void WriteMetadata(
149 TraceLoggingMetadataCollector collector,
151 EventFieldFormat format)
153 collector.AddScalar(name, Statics.Format32(format, TraceLoggingDataType.Int32));
156 public override void WriteData(TraceLoggingDataCollector collector, ref Int32 value)
158 collector.AddScalar(value);
163 /// TraceLogging: Type handler for UInt32.
165 internal sealed class UInt32TypeInfo
166 : TraceLoggingTypeInfo<UInt32>
168 public override void WriteMetadata(
169 TraceLoggingMetadataCollector collector,
171 EventFieldFormat format)
173 collector.AddScalar(name, Statics.Format32(format, TraceLoggingDataType.UInt32));
176 public override void WriteData(TraceLoggingDataCollector collector, ref UInt32 value)
178 collector.AddScalar(value);
183 /// TraceLogging: Type handler for Int64.
185 internal sealed class Int64TypeInfo
186 : TraceLoggingTypeInfo<Int64>
188 public override void WriteMetadata(
189 TraceLoggingMetadataCollector collector,
191 EventFieldFormat format)
193 collector.AddScalar(name, Statics.Format64(format, TraceLoggingDataType.Int64));
196 public override void WriteData(TraceLoggingDataCollector collector, ref Int64 value)
198 collector.AddScalar(value);
203 /// TraceLogging: Type handler for UInt64.
205 internal sealed class UInt64TypeInfo
206 : TraceLoggingTypeInfo<UInt64>
208 public override void WriteMetadata(
209 TraceLoggingMetadataCollector collector,
211 EventFieldFormat format)
213 collector.AddScalar(name, Statics.Format64(format, TraceLoggingDataType.UInt64));
216 public override void WriteData(TraceLoggingDataCollector collector, ref UInt64 value)
218 collector.AddScalar(value);
223 /// TraceLogging: Type handler for IntPtr.
225 internal sealed class IntPtrTypeInfo
226 : TraceLoggingTypeInfo<IntPtr>
228 public override void WriteMetadata(
229 TraceLoggingMetadataCollector collector,
231 EventFieldFormat format)
233 collector.AddScalar(name, Statics.FormatPtr(format, Statics.IntPtrType));
236 public override void WriteData(TraceLoggingDataCollector collector, ref IntPtr value)
238 collector.AddScalar(value);
243 /// TraceLogging: Type handler for UIntPtr.
245 internal sealed class UIntPtrTypeInfo
246 : TraceLoggingTypeInfo<UIntPtr>
248 public override void WriteMetadata(
249 TraceLoggingMetadataCollector collector,
251 EventFieldFormat format)
253 collector.AddScalar(name, Statics.FormatPtr(format, Statics.UIntPtrType));
256 public override void WriteData(TraceLoggingDataCollector collector, ref UIntPtr value)
258 collector.AddScalar(value);
263 /// TraceLogging: Type handler for Double.
265 internal sealed class DoubleTypeInfo
266 : TraceLoggingTypeInfo<Double>
268 public override void WriteMetadata(
269 TraceLoggingMetadataCollector collector,
271 EventFieldFormat format)
273 collector.AddScalar(name, Statics.Format64(format, TraceLoggingDataType.Double));
276 public override void WriteData(TraceLoggingDataCollector collector, ref Double value)
278 collector.AddScalar(value);
283 /// TraceLogging: Type handler for Single.
285 internal sealed class SingleTypeInfo
286 : TraceLoggingTypeInfo<Single>
288 public override void WriteMetadata(
289 TraceLoggingMetadataCollector collector,
291 EventFieldFormat format)
293 collector.AddScalar(name, Statics.Format32(format, TraceLoggingDataType.Float));
296 public override void WriteData(TraceLoggingDataCollector collector, ref Single value)
298 collector.AddScalar(value);
303 /// TraceLogging: Type handler for Char.
305 internal sealed class CharTypeInfo
306 : TraceLoggingTypeInfo<Char>
308 public override void WriteMetadata(
309 TraceLoggingMetadataCollector collector,
311 EventFieldFormat format)
313 collector.AddScalar(name, Statics.Format16(format, TraceLoggingDataType.Char16));
316 public override void WriteData(TraceLoggingDataCollector collector, ref Char value)
318 collector.AddScalar(value);
324 #region Primitive arrays
327 /// TraceLogging: Type handler for Boolean[].
329 internal sealed class BooleanArrayTypeInfo
330 : TraceLoggingTypeInfo<Boolean[]>
332 public override void WriteMetadata(
333 TraceLoggingMetadataCollector collector,
335 EventFieldFormat format)
337 collector.AddArray(name, Statics.Format8(format, TraceLoggingDataType.Boolean8));
340 public override void WriteData(TraceLoggingDataCollector collector, ref Boolean[] value)
342 collector.AddArray(value);
347 /// TraceLogging: Type handler for Byte[].
349 internal sealed class ByteArrayTypeInfo
350 : TraceLoggingTypeInfo<Byte[]>
352 public override void WriteMetadata(
353 TraceLoggingMetadataCollector collector,
355 EventFieldFormat format)
360 collector.AddBinary(name, Statics.MakeDataType(TraceLoggingDataType.Binary, format));
362 case EventFieldFormat.String:
363 collector.AddBinary(name, TraceLoggingDataType.CountedMbcsString);
365 case EventFieldFormat.Xml:
366 collector.AddBinary(name, TraceLoggingDataType.CountedMbcsXml);
368 case EventFieldFormat.Json:
369 collector.AddBinary(name, TraceLoggingDataType.CountedMbcsJson);
371 case EventFieldFormat.Boolean:
372 collector.AddArray(name, TraceLoggingDataType.Boolean8);
374 case EventFieldFormat.Hexadecimal:
375 collector.AddArray(name, TraceLoggingDataType.HexInt8);
378 case EventSourceFieldFormat.Signed:
379 collector.AddArray(name, TraceLoggingDataType.Int8);
381 case EventSourceFieldFormat.Unsigned:
382 collector.AddArray(name, TraceLoggingDataType.UInt8);
388 public override void WriteData(TraceLoggingDataCollector collector, ref Byte[] value)
390 collector.AddBinary(value);
395 /// TraceLogging: Type handler for SByte[].
397 internal sealed class SByteArrayTypeInfo
398 : TraceLoggingTypeInfo<SByte[]>
400 public override void WriteMetadata(
401 TraceLoggingMetadataCollector collector,
403 EventFieldFormat format)
405 collector.AddArray(name, Statics.Format8(format, TraceLoggingDataType.Int8));
408 public override void WriteData(TraceLoggingDataCollector collector, ref SByte[] value)
410 collector.AddArray(value);
415 /// TraceLogging: Type handler for Int16[].
417 internal sealed class Int16ArrayTypeInfo
418 : TraceLoggingTypeInfo<Int16[]>
420 public override void WriteMetadata(
421 TraceLoggingMetadataCollector collector,
423 EventFieldFormat format)
425 collector.AddArray(name, Statics.Format16(format, TraceLoggingDataType.Int16));
428 public override void WriteData(TraceLoggingDataCollector collector, ref Int16[] value)
430 collector.AddArray(value);
435 /// TraceLogging: Type handler for UInt16[].
437 internal sealed class UInt16ArrayTypeInfo
438 : TraceLoggingTypeInfo<UInt16[]>
440 public override void WriteMetadata(
441 TraceLoggingMetadataCollector collector,
443 EventFieldFormat format)
445 collector.AddArray(name, Statics.Format16(format, TraceLoggingDataType.UInt16));
448 public override void WriteData(TraceLoggingDataCollector collector, ref UInt16[] value)
450 collector.AddArray(value);
455 /// TraceLogging: Type handler for Int32[].
457 internal sealed class Int32ArrayTypeInfo
458 : TraceLoggingTypeInfo<Int32[]>
460 public override void WriteMetadata(
461 TraceLoggingMetadataCollector collector,
463 EventFieldFormat format)
465 collector.AddArray(name, Statics.Format32(format, TraceLoggingDataType.Int32));
468 public override void WriteData(TraceLoggingDataCollector collector, ref Int32[] value)
470 collector.AddArray(value);
475 /// TraceLogging: Type handler for UInt32[].
477 internal sealed class UInt32ArrayTypeInfo
478 : TraceLoggingTypeInfo<UInt32[]>
480 public override void WriteMetadata(
481 TraceLoggingMetadataCollector collector,
483 EventFieldFormat format)
485 collector.AddArray(name, Statics.Format32(format, TraceLoggingDataType.UInt32));
488 public override void WriteData(TraceLoggingDataCollector collector, ref UInt32[] value)
490 collector.AddArray(value);
495 /// TraceLogging: Type handler for Int64[].
497 internal sealed class Int64ArrayTypeInfo
498 : TraceLoggingTypeInfo<Int64[]>
500 public override void WriteMetadata(
501 TraceLoggingMetadataCollector collector,
503 EventFieldFormat format)
505 collector.AddArray(name, Statics.Format64(format, TraceLoggingDataType.Int64));
508 public override void WriteData(TraceLoggingDataCollector collector, ref Int64[] value)
510 collector.AddArray(value);
515 /// TraceLogging: Type handler for UInt64[].
517 internal sealed class UInt64ArrayTypeInfo
518 : TraceLoggingTypeInfo<UInt64[]>
520 public override void WriteMetadata(
521 TraceLoggingMetadataCollector collector,
523 EventFieldFormat format)
525 collector.AddArray(name, Statics.Format64(format, TraceLoggingDataType.UInt64));
528 public override void WriteData(TraceLoggingDataCollector collector, ref UInt64[] value)
530 collector.AddArray(value);
535 /// TraceLogging: Type handler for IntPtr[].
537 internal sealed class IntPtrArrayTypeInfo
538 : TraceLoggingTypeInfo<IntPtr[]>
540 public override void WriteMetadata(
541 TraceLoggingMetadataCollector collector,
543 EventFieldFormat format)
545 collector.AddArray(name, Statics.FormatPtr(format, Statics.IntPtrType));
548 public override void WriteData(TraceLoggingDataCollector collector, ref IntPtr[] value)
550 collector.AddArray(value);
555 /// TraceLogging: Type handler for UIntPtr[].
557 internal sealed class UIntPtrArrayTypeInfo
558 : TraceLoggingTypeInfo<UIntPtr[]>
560 public override void WriteMetadata(
561 TraceLoggingMetadataCollector collector,
563 EventFieldFormat format)
565 collector.AddArray(name, Statics.FormatPtr(format, Statics.UIntPtrType));
568 public override void WriteData(TraceLoggingDataCollector collector, ref UIntPtr[] value)
570 collector.AddArray(value);
575 /// TraceLogging: Type handler for Char[].
577 internal sealed class CharArrayTypeInfo
578 : TraceLoggingTypeInfo<Char[]>
580 public override void WriteMetadata(
581 TraceLoggingMetadataCollector collector,
583 EventFieldFormat format)
585 collector.AddArray(name, Statics.Format16(format, TraceLoggingDataType.Char16));
588 public override void WriteData(TraceLoggingDataCollector collector, ref Char[] value)
590 collector.AddArray(value);
595 /// TraceLogging: Type handler for Double[].
597 internal sealed class DoubleArrayTypeInfo
598 : TraceLoggingTypeInfo<Double[]>
600 public override void WriteMetadata(
601 TraceLoggingMetadataCollector collector,
603 EventFieldFormat format)
605 collector.AddArray(name, Statics.Format64(format, TraceLoggingDataType.Double));
608 public override void WriteData(TraceLoggingDataCollector collector, ref Double[] value)
610 collector.AddArray(value);
615 /// TraceLogging: Type handler for Single[].
617 internal sealed class SingleArrayTypeInfo
618 : TraceLoggingTypeInfo<Single[]>
620 public override void WriteMetadata(
621 TraceLoggingMetadataCollector collector,
623 EventFieldFormat format)
625 collector.AddArray(name, Statics.Format32(format, TraceLoggingDataType.Float));
628 public override void WriteData(TraceLoggingDataCollector collector, ref Single[] value)
630 collector.AddArray(value);
638 internal sealed class EnumByteTypeInfo<EnumType>
639 : TraceLoggingTypeInfo<EnumType>
641 public override void WriteMetadata(
642 TraceLoggingMetadataCollector collector,
644 EventFieldFormat format)
646 collector.AddScalar(name, Statics.Format8(format, TraceLoggingDataType.UInt8));
649 public override void WriteData(TraceLoggingDataCollector collector, ref EnumType value)
651 collector.AddScalar(EnumHelper<Byte>.Cast(value));
654 public override object GetData(object value)
660 internal sealed class EnumSByteTypeInfo<EnumType>
661 : TraceLoggingTypeInfo<EnumType>
663 public override void WriteMetadata(
664 TraceLoggingMetadataCollector collector,
666 EventFieldFormat format)
668 collector.AddScalar(name, Statics.Format8(format, TraceLoggingDataType.Int8));
671 public override void WriteData(TraceLoggingDataCollector collector, ref EnumType value)
673 collector.AddScalar(EnumHelper<SByte>.Cast(value));
676 public override object GetData(object value)
682 internal sealed class EnumInt16TypeInfo<EnumType>
683 : TraceLoggingTypeInfo<EnumType>
685 public override void WriteMetadata(
686 TraceLoggingMetadataCollector collector,
688 EventFieldFormat format)
690 collector.AddScalar(name, Statics.Format16(format, TraceLoggingDataType.Int16));
693 public override void WriteData(TraceLoggingDataCollector collector, ref EnumType value)
695 collector.AddScalar(EnumHelper<Int16>.Cast(value));
698 public override object GetData(object value)
704 internal sealed class EnumUInt16TypeInfo<EnumType>
705 : TraceLoggingTypeInfo<EnumType>
707 public override void WriteMetadata(
708 TraceLoggingMetadataCollector collector,
710 EventFieldFormat format)
712 collector.AddScalar(name, Statics.Format16(format, TraceLoggingDataType.UInt16));
715 public override void WriteData(TraceLoggingDataCollector collector, ref EnumType value)
717 collector.AddScalar(EnumHelper<UInt16>.Cast(value));
720 public override object GetData(object value)
726 internal sealed class EnumInt32TypeInfo<EnumType>
727 : TraceLoggingTypeInfo<EnumType>
729 public override void WriteMetadata(
730 TraceLoggingMetadataCollector collector,
732 EventFieldFormat format)
734 collector.AddScalar(name, Statics.Format32(format, TraceLoggingDataType.Int32));
737 public override void WriteData(TraceLoggingDataCollector collector, ref EnumType value)
739 collector.AddScalar(EnumHelper<Int32>.Cast(value));
742 public override object GetData(object value)
748 internal sealed class EnumUInt32TypeInfo<EnumType>
749 : TraceLoggingTypeInfo<EnumType>
751 public override void WriteMetadata(
752 TraceLoggingMetadataCollector collector,
754 EventFieldFormat format)
756 collector.AddScalar(name, Statics.Format32(format, TraceLoggingDataType.UInt32));
759 public override void WriteData(TraceLoggingDataCollector collector, ref EnumType value)
761 collector.AddScalar(EnumHelper<UInt32>.Cast(value));
764 public override object GetData(object value)
770 internal sealed class EnumInt64TypeInfo<EnumType>
771 : TraceLoggingTypeInfo<EnumType>
773 public override void WriteMetadata(
774 TraceLoggingMetadataCollector collector,
776 EventFieldFormat format)
778 collector.AddScalar(name, Statics.Format64(format, TraceLoggingDataType.Int64));
781 public override void WriteData(TraceLoggingDataCollector collector, ref EnumType value)
783 collector.AddScalar(EnumHelper<Int64>.Cast(value));
786 public override object GetData(object value)
792 internal sealed class EnumUInt64TypeInfo<EnumType>
793 : TraceLoggingTypeInfo<EnumType>
795 public override void WriteMetadata(
796 TraceLoggingMetadataCollector collector,
798 EventFieldFormat format)
800 collector.AddScalar(name, Statics.Format64(format, TraceLoggingDataType.UInt64));
803 public override void WriteData(TraceLoggingDataCollector collector, ref EnumType value)
805 collector.AddScalar(EnumHelper<UInt64>.Cast(value));
808 public override object GetData(object value)
816 #region Other built-in types
819 /// TraceLogging: Type handler for String.
821 internal sealed class StringTypeInfo
822 : TraceLoggingTypeInfo<String>
824 public override void WriteMetadata(
825 TraceLoggingMetadataCollector collector,
827 EventFieldFormat format)
829 collector.AddBinary(name, Statics.MakeDataType(TraceLoggingDataType.CountedUtf16String, format));
832 public override void WriteData(TraceLoggingDataCollector collector, ref String value)
834 collector.AddBinary(value);
837 public override object GetData(object value)
839 object val = base.GetData(value);
848 /// TraceLogging: Type handler for Guid.
850 internal sealed class GuidTypeInfo
851 : TraceLoggingTypeInfo<Guid>
853 public override void WriteMetadata(
854 TraceLoggingMetadataCollector collector,
856 EventFieldFormat format)
858 collector.AddScalar(name, Statics.MakeDataType(TraceLoggingDataType.Guid, format));
861 public override void WriteData(TraceLoggingDataCollector collector, ref Guid value)
863 collector.AddScalar(value);
868 /// TraceLogging: Type handler for Guid[].
870 internal sealed class GuidArrayTypeInfo
871 : TraceLoggingTypeInfo<Guid[]>
873 public override void WriteMetadata(
874 TraceLoggingMetadataCollector collector,
876 EventFieldFormat format)
878 collector.AddArray(name, Statics.MakeDataType(TraceLoggingDataType.Guid, format));
881 public override void WriteData(TraceLoggingDataCollector collector, ref Guid[] value)
883 collector.AddArray(value);
888 /// TraceLogging: Type handler for DateTime.
890 internal sealed class DateTimeTypeInfo
891 : TraceLoggingTypeInfo<DateTime>
893 public override void WriteMetadata(
894 TraceLoggingMetadataCollector collector,
896 EventFieldFormat format)
898 collector.AddScalar(name, Statics.MakeDataType(TraceLoggingDataType.FileTime, format));
901 public override void WriteData(TraceLoggingDataCollector collector, ref DateTime value)
903 var ticks = value.Ticks;
904 collector.AddScalar(ticks < 504911232000000000 ? 0 : ticks - 504911232000000000);
909 /// TraceLogging: Type handler for DateTimeOffset.
911 internal sealed class DateTimeOffsetTypeInfo
912 : TraceLoggingTypeInfo<DateTimeOffset>
914 public override void WriteMetadata(TraceLoggingMetadataCollector collector, string name, EventFieldFormat format)
916 var group = collector.AddGroup(name);
917 group.AddScalar("Ticks", Statics.MakeDataType(TraceLoggingDataType.FileTime, format));
918 group.AddScalar("Offset", TraceLoggingDataType.Int64);
921 public override void WriteData(TraceLoggingDataCollector collector, ref DateTimeOffset value)
923 var ticks = value.Ticks;
924 collector.AddScalar(ticks < 504911232000000000 ? 0 : ticks - 504911232000000000);
925 collector.AddScalar(value.Offset.Ticks);
930 /// TraceLogging: Type handler for TimeSpan.
932 internal sealed class TimeSpanTypeInfo
933 : TraceLoggingTypeInfo<TimeSpan>
935 public override void WriteMetadata(
936 TraceLoggingMetadataCollector collector,
938 EventFieldFormat format)
940 collector.AddScalar(name, Statics.MakeDataType(TraceLoggingDataType.Int64, format));
943 public override void WriteData(TraceLoggingDataCollector collector, ref TimeSpan value)
945 collector.AddScalar(value.Ticks);
950 /// TraceLogging: Type handler for Decimal. (Note: not full-fidelity, exposed as Double.)
952 internal sealed class DecimalTypeInfo
953 : TraceLoggingTypeInfo<Decimal>
955 public override void WriteMetadata(
956 TraceLoggingMetadataCollector collector,
958 EventFieldFormat format)
960 collector.AddScalar(name, Statics.MakeDataType(TraceLoggingDataType.Double, format));
963 public override void WriteData(TraceLoggingDataCollector collector, ref decimal value)
965 collector.AddScalar((double)value);
970 /// TraceLogging: Type handler for KeyValuePair.
972 /// <typeparam name="K">Type of the KeyValuePair's Key property.</typeparam>
973 /// <typeparam name="V">Type of the KeyValuePair's Value property.</typeparam>
974 internal sealed class KeyValuePairTypeInfo<K, V>
975 : TraceLoggingTypeInfo<KeyValuePair<K, V>>
977 private readonly TraceLoggingTypeInfo<K> keyInfo;
978 private readonly TraceLoggingTypeInfo<V> valueInfo;
980 public KeyValuePairTypeInfo(List<Type> recursionCheck)
982 this.keyInfo = TraceLoggingTypeInfo<K>.GetInstance(recursionCheck);
983 this.valueInfo = TraceLoggingTypeInfo<V>.GetInstance(recursionCheck);
986 public override void WriteMetadata(
987 TraceLoggingMetadataCollector collector,
989 EventFieldFormat format)
991 var group = collector.AddGroup(name);
992 this.keyInfo.WriteMetadata(group, "Key", EventFieldFormat.Default);
993 this.valueInfo.WriteMetadata(group, "Value", format);
996 public override void WriteData(
997 TraceLoggingDataCollector collector,
998 ref KeyValuePair<K, V> value)
1000 var key = value.Key;
1001 var val = value.Value;
1002 this.keyInfo.WriteData(collector, ref key);
1003 this.valueInfo.WriteData(collector, ref val);
1006 public override object GetData(object value)
1008 var serializedType = new Dictionary<string, object>();
1009 var keyValuePair = (KeyValuePair<K, V>) value;
1010 serializedType.Add("Key", this.keyInfo.GetData(keyValuePair.Key));
1011 serializedType.Add("Value", this.valueInfo.GetData(keyValuePair.Value));
1012 return serializedType;
1017 /// TraceLogging: Type handler for Nullable.
1019 /// <typeparam name="T">Type of the Nullable's Value property.</typeparam>
1020 internal sealed class NullableTypeInfo<T>
1021 : TraceLoggingTypeInfo<Nullable<T>>
1024 private readonly TraceLoggingTypeInfo<T> valueInfo;
1026 public NullableTypeInfo(List<Type> recursionCheck)
1028 this.valueInfo = TraceLoggingTypeInfo<T>.GetInstance(recursionCheck);
1031 public override void WriteMetadata(
1032 TraceLoggingMetadataCollector collector,
1034 EventFieldFormat format)
1036 var group = collector.AddGroup(name);
1037 group.AddScalar("HasValue", TraceLoggingDataType.Boolean8);
1038 this.valueInfo.WriteMetadata(group, "Value", format);
1041 public override void WriteData(
1042 TraceLoggingDataCollector collector,
1043 ref Nullable<T> value)
1045 var hasValue = value.HasValue;
1046 collector.AddScalar(hasValue);
1047 var val = hasValue ? value.Value : default(T);
1048 this.valueInfo.WriteData(collector, ref val);