public EventProperties Serialize()

in src/telemetry/aria/AriaEventSerializer.cs [17:99]


        public EventProperties Serialize(ITelemetryEvent evt)
        {
            if (evt == null)
            {
                throw new ArgumentNullException(nameof(evt));
            }

            var eventData = new EventProperties();
            eventData.Name = evt.Name;

            // TODO this could be optimized by generating and caching the dynamic code to do this generation
            // instead of needing to use reflection each time

            var publicProps = evt.GetType()
                .GetProperties(BindingFlags.Public | BindingFlags.Instance)
                .Where(p => p.CanRead && p.Name != "Name");

            foreach (var prop in publicProps)
            {
                string name = prop.Name;
                AriaPii pii = ToAriaPII(prop.GetCustomAttribute<PiiAttribute>(true)?.Kind ?? PiiKind.None);
                object? value = prop.GetValue(evt);

                switch (value)
                {
                    case null:
                        // do nothing
                        break;

                    case string strValue:
                        eventData.SetProperty(name, strValue, pii);
                        break;

                    case bool boolValue:
                        eventData.SetProperty(name, boolValue, pii);
                        break;

                    case DateTime dtValue:
                        eventData.SetProperty(name, dtValue, pii);
                        break;

                    case DateTimeOffset dtValue:
                        eventData.SetProperty(name, dtValue.UtcDateTime, pii);
                        break;

                    case Guid guidValue:
                        eventData.SetProperty(name, guidValue, pii);
                        break;

                    case sbyte:
                    case short:
                    case int:
                    case byte:
                    case ushort:
                    case uint:
                    case long:
                        eventData.SetProperty(name, Convert.ToInt64(value), pii);
                        break;

                    case float:
                    case double:
                    case ulong:
                        eventData.SetProperty(name, Convert.ToDouble(value), pii);
                        break;

                    case Enum enumValue:
                        eventData.SetProperty(name, value.ToString(), pii);
                        break;

                    default:
                        // don't know how to handle this type so try to use the generic TypeConverter to get a string
                        var conv = System.ComponentModel.TypeDescriptor.GetConverter(prop.PropertyType);
                        string? strVal = conv.ConvertToInvariantString(value);
                        if (strVal != null)
                        {
                            eventData.SetProperty(name, strVal, pii);
                        }
                        break;
                }
            }

            return eventData;
        }