Skip to content

Commit 1da186b

Browse files
[EventGrid] Generate switch expressions instead of dictionary lookups (#49426)
* Generate switch expression * Ordinal version * Simplified if version for comparison --------- Co-authored-by: Daniel Marbach <[email protected]>
1 parent 4518105 commit 1da186b

File tree

2 files changed

+12
-19
lines changed

2 files changed

+12
-19
lines changed

sdk/eventgrid/Azure.Messaging.EventGrid/EventGridSourceGenerator/src/EventGridSourceGenerator.cs

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -109,28 +109,21 @@ internal class SystemEventExtensions
109109
{{
110110
public static object AsSystemEventData(string eventType, JsonElement data)
111111
{{
112-
if (s_systemEventDeserializers.TryGetValue(eventType, out Func<JsonElement,{(_isSystemEventsLibrary ? " ModelReaderWriterOptions," : string.Empty)} object> systemDeserializationFunction))
113-
{{
114-
return systemDeserializationFunction(data{(_isSystemEventsLibrary ? ", null" : string.Empty)});
115-
}}
116-
else
117-
{{
118-
return null;
119-
}}
120-
}}
121-
122-
internal static readonly IReadOnlyDictionary<string, Func<JsonElement,{(_isSystemEventsLibrary ? " ModelReaderWriterOptions," : string.Empty)} object>> s_systemEventDeserializers = new Dictionary<string, Func<JsonElement,{(_isSystemEventsLibrary ? " ModelReaderWriterOptions," : string.Empty)} object>>(StringComparer.OrdinalIgnoreCase)
123-
{{
112+
var eventTypeSpan = eventType.AsSpan();
124113
");
125114
foreach (SystemEventNode sysEvent in _visitor.SystemEvents)
126115
{
127116
// Add each an entry for each system event to the dictionary containing a mapping from constant name to deserialization method.
128117
sourceBuilder.AppendLine(
129-
$"{Indent}{Indent}{Indent}{{ SystemEventNames.{sysEvent.EventConstantName}, {sysEvent.EventName}.{sysEvent.DeserializeMethod} }},");
118+
$"{Indent}{Indent}{Indent}if (eventTypeSpan.Equals(SystemEventNames.{sysEvent.EventConstantName}.AsSpan(), StringComparison.OrdinalIgnoreCase))");
119+
sourceBuilder.AppendLine(
120+
$"{Indent}{Indent}{Indent}{Indent}return {sysEvent.EventName}.{sysEvent.DeserializeMethod}(data{(_isSystemEventsLibrary ? ", null" : string.Empty)});");
130121
}
131-
sourceBuilder.Append($@"{Indent}{Indent}}};
132-
{Indent}}}
133-
}}");
122+
sourceBuilder.AppendLine($"{Indent}{Indent}{Indent}return null;");
123+
sourceBuilder.AppendLine($"{Indent}{Indent}}}");
124+
sourceBuilder.AppendLine($"{Indent}}}");
125+
sourceBuilder.AppendLine("}");
126+
134127
return sourceBuilder.ToString();
135128
}
136129
}

sdk/eventgrid/Azure.Messaging.EventGrid/tests/SystemEventTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.ComponentModel;
77
using System.Linq;
88
using System.Reflection;
9+
using System.Text.Json;
910
using Azure.Messaging.EventGrid.SystemEvents;
1011
using NUnit.Framework;
1112

@@ -39,10 +40,9 @@ public void MappingContainsAllSystemEvents()
3940
}
4041

4142
ValidateName(systemEvent.Name);
42-
Assert.IsTrue(
43-
SystemEventExtensions.s_systemEventDeserializers.Values.Any(
44-
f => f.Method.ReturnType == systemEvent), systemEvent.Name);
43+
Assert.IsNotNull(SystemEventExtensions.AsSystemEventData(systemEvent.Name, JsonDocument.Parse("{}").RootElement));
4544
}
45+
Assert.IsNull(SystemEventExtensions.AsSystemEventData("DoesNotExist", JsonDocument.Parse("{}").RootElement));
4646
}
4747

4848
[Test]

0 commit comments

Comments
 (0)