{"record":{"id":"4c5218c42ce5e6ff","repo":"dotnet/aspnetcore","slug":"the-method-methodinfo-cannot-be-used-as-an-event","errorCode":null,"errorMessage":"The method {methodInfo} cannot be used as an event handler because it declares more than one parameter.","messagePattern":"The method (.+?) cannot be used as an event handler because it declares more than one parameter\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Components/Components/src/RenderTree/EventArgsTypeCache.cs","lineNumber":33,"sourceCode":"    {\n        if (HotReloadManager.IsSupported)\n        {\n            HotReloadManager.Default.OnDeltaApplied += Cache.Clear;\n        }\n    }\n\n    public static Type GetEventArgsType(MethodInfo methodInfo)\n    {\n        return Cache.GetOrAdd(methodInfo, methodInfo =>\n        {\n            var parameterInfos = methodInfo.GetParameters();\n            if (parameterInfos.Length == 0)\n            {\n                return typeof(EventArgs);\n            }\n            else if (parameterInfos.Length > 1)\n            {\n                throw new InvalidOperationException($\"The method {methodInfo} cannot be used as an event handler because it declares more than one parameter.\");\n            }\n            else\n            {\n                var declaredType = parameterInfos[0].ParameterType;\n                if (typeof(EventArgs).IsAssignableFrom(declaredType))\n                {\n                    return declaredType;\n                }\n                else\n                {\n                    throw new InvalidOperationException($\"The event handler parameter type {declaredType.FullName} for event must inherit from {typeof(EventArgs).FullName}.\");\n                }\n            }\n        });\n    }\n}\n","sourceCodeStart":15,"sourceCodeEnd":50,"githubUrl":"https://github.com/dotnet/aspnetcore/blob/3600ca084e9c8b5f4174fc5e747f4c52d2100806/src/Components/Components/src/RenderTree/EventArgsTypeCache.cs#L15-L50","documentation":"EventArgsTypeCache.GetEventArgsType resolves the event-args type for a C# method used as a Blazor event handler (e.g., @onclick=\"OnClick\"). Blazor event handlers may take zero parameters (treated as EventArgs) or exactly one parameter whose type derives from EventArgs. A method declaring two or more parameters cannot be invoked by the event-dispatch pipeline with a single event argument, so the cache throws at first dispatch.","triggerScenarios":"Wiring @onclick=\"HandleClick\" where HandleClick has signature void HandleClick(MouseEventArgs e, int extra). Using a method with multiple parameters as an event handler in Razor. Passing a delegate whose Invoke has more than one parameter.","commonSituations":"Adding an extra parameter to an existing event handler (e.g., for context) without refactoring to use a closure or captured state. Reusing a general-purpose method as an event handler. Inadvertently selecting an overload with multiple parameters.","solutions":["Reduce the handler to zero or one parameter; capture additional context via closures or fields instead of extra parameters.","If the method needs more data, wrap it: @onclick=\"@(() => HandleClick(e, extra))\".","Ensure the chosen overload has at most one EventArgs-derived parameter."],"exampleFix":"// before\nvoid HandleClick(MouseEventArgs e, int extra) { ... }\n< button @onclick=\"HandleClick\">...</button>\n\n// after\nvoid HandleClick(MouseEventArgs e) { ... /* use captured 'extra' */ }\n<button @onclick=\"HandleClick\">...</button>\n// or\n<button @onclick=\"@(() => HandleClick(arg, extra))\">...</button>","handlingStrategy":"type-guard","validationCode":null,"typeGuard":"static bool IsValidEventHandlerSignature(MethodInfo m)\n{\n    var ps = m.GetParameters();\n    return ps.Length == 0\n        || (ps.Length == 1 && typeof(EventArgs).IsAssignableFrom(ps[0].ParameterType));\n}\n\nvar method = typeof(MyComponent).GetMethod(nameof(MyComponent.HandleClick));\nAssert.True(IsValidEventHandlerSignature(method!));","tryCatchPattern":null,"preventionTips":["Keep event-handler methods to zero or one parameter.","Pass additional context via closures, not extra parameters.","Add a unit test validating all @on-prefixed handler signatures."],"tags":["blazor","events","event-handler","reflection"],"backgroundTag":null,"analyzedSha":"3600ca084e9c8b5f4174fc5e747f4c52d2100806","analyzedAt":"2026-08-11T16:32:30.678Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}