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;
}