Skip to content

Commit 6143ec0

Browse files
committed
Refactor TryMatchMethod for clarity and efficiency
Refactored the `TryMatchMethod` function to improve readability and performance by introducing a fast path for parameterless methods and delegating complex logic to a new helper method `TryExtractArgsFromParts`. The new helper method handles command part matching, placeholder resolution, and type conversion. Updated comments for better maintainability.
1 parent 7d371b3 commit 6143ec0

1 file changed

Lines changed: 37 additions & 39 deletions

File tree

Sources/TelegramBot/Handlers/InlineQueryHandler.cs

Lines changed: 37 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,9 @@ private bool TryMatchMethod(MethodInfo method, string command, out List<object>
7272
{
7373
args = new List<object>();
7474

75-
var attributes = method.GetCustomAttributes(typeof(InlineCommandAttribute), inherit: false);
75+
var attributes = method.GetCustomAttributes(typeof(InlineCommandAttribute), inherit: false)
76+
.OfType<InlineCommandAttribute>()
77+
.ToArray();
7678
if (attributes.Length == 0)
7779
{
7880
return false;
@@ -81,67 +83,63 @@ private bool TryMatchMethod(MethodInfo method, string command, out List<object>
8183
var incomingCommandParts = command.Split('/');
8284
var methodParameters = method.GetParameters();
8385

84-
foreach (var attribute in attributes)
86+
// Fast path: parameterless method with an exact attribute command
87+
if (methodParameters.Length == 0)
8588
{
86-
if (!(attribute is InlineCommandAttribute botAttribute))
89+
if (attributes.Any(a => string.Equals(a.Command, command, StringComparison.Ordinal)))
8790
{
88-
continue;
91+
return true;
8992
}
93+
return false;
94+
}
9095

96+
foreach (var botAttribute in attributes)
97+
{
9198
var controllerCommandParts = botAttribute.Command.Split('/');
92-
93-
// Exact match shortcut for methods without parameters
94-
if (methodParameters.Length == 0)
99+
if (controllerCommandParts.Length != incomingCommandParts.Length)
95100
{
96-
if (string.Equals(botAttribute.Command, command, StringComparison.Ordinal))
97-
{
98-
return true;
99-
}
100101
continue;
101102
}
102103

103-
if (controllerCommandParts.Length != incomingCommandParts.Length)
104+
if (TryExtractArgsFromParts(controllerCommandParts, incomingCommandParts, methodParameters, out var tempArgs))
104105
{
105-
continue;
106+
args = tempArgs;
107+
return true;
106108
}
109+
}
107110

108-
var tempArgs = new List<object>(incomingCommandParts.Length);
109-
bool match = true;
111+
return false;
112+
}
110113

111-
for (int i = 0; i < controllerCommandParts.Length; i++)
112-
{
113-
var controllerPart = controllerCommandParts[i];
114-
var incomingPart = incomingCommandParts[i];
114+
private bool TryExtractArgsFromParts(string[] controllerCommandParts, string[] incomingCommandParts, ParameterInfo[] methodParameters, out List<object> tempArgs)
115+
{
116+
tempArgs = new List<object>(incomingCommandParts.Length);
115117

116-
if (IsPlaceholder(controllerPart))
118+
for (int i = 0; i < controllerCommandParts.Length; i++)
119+
{
120+
var controllerPart = controllerCommandParts[i];
121+
var incomingPart = incomingCommandParts[i];
122+
123+
if (IsPlaceholder(controllerPart))
124+
{
125+
var name = PlaceholderName(controllerPart);
126+
var parameter = methodParameters.FirstOrDefault(p => p.Name == name);
127+
if (parameter != null)
117128
{
118-
var name = PlaceholderName(controllerPart);
119-
var parameter = methodParameters.FirstOrDefault(p => p.Name == name);
120-
if (parameter != null)
129+
if (!TryConvertToType(incomingPart, parameter.ParameterType))
121130
{
122-
if (!TryConvertToType(incomingPart, parameter.ParameterType))
123-
{
124-
match = false;
125-
break;
126-
}
131+
return false;
127132
}
128-
tempArgs.Add(incomingPart);
129-
}
130-
else if (!string.Equals(controllerPart, incomingPart, StringComparison.Ordinal))
131-
{
132-
match = false;
133-
break;
134133
}
134+
tempArgs.Add(incomingPart);
135135
}
136-
137-
if (match)
136+
else if (!string.Equals(controllerPart, incomingPart, StringComparison.Ordinal))
138137
{
139-
args = tempArgs;
140-
return true;
138+
return false;
141139
}
142140
}
143141

144-
return false;
142+
return true;
145143
}
146144

147145
private bool TryConvertToType(string value, Type targetType)

0 commit comments

Comments
 (0)