@@ -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