{"record":{"id":"255076c6239b77b0","repo":"dotnet/reactive","slug":"strings-linq-event-add-method-should-take-one-parameter","errorCode":null,"errorMessage":"Strings_Linq.EVENT_ADD_METHOD_SHOULD_TAKE_ONE_PARAMETER","messagePattern":"Strings_Linq\\.EVENT_ADD_METHOD_SHOULD_TAKE_ONE_PARAMETER","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"Rx.NET/Source/src/System.Reactive/Internal/ReflectionUtils.cs","lineNumber":47,"sourceCode":"\n            if (target == null)\n            {\n                e = targetType.GetEvent(eventName, BindingFlags.Public | BindingFlags.Static)\n                    ?? throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, Strings_Linq.COULD_NOT_FIND_STATIC_EVENT, eventName, targetType.FullName));\n            }\n            else\n            {\n                e = targetType.GetEvent(eventName, BindingFlags.Public | BindingFlags.Instance)\n                    ?? throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, Strings_Linq.COULD_NOT_FIND_INSTANCE_EVENT, eventName, targetType.FullName));\n            }\n\n            addMethod = e.GetAddMethod() ?? throw new InvalidOperationException(Strings_Linq.EVENT_MISSING_ADD_METHOD);\n            removeMethod = e.GetRemoveMethod() ?? throw new InvalidOperationException(Strings_Linq.EVENT_MISSING_REMOVE_METHOD);\n\n            var psa = addMethod.GetParameters();\n            if (psa.Length != 1)\n            {\n                throw new InvalidOperationException(Strings_Linq.EVENT_ADD_METHOD_SHOULD_TAKE_ONE_PARAMETER);\n            }\n\n            var psr = removeMethod.GetParameters();\n            if (psr.Length != 1)\n            {\n                throw new InvalidOperationException(Strings_Linq.EVENT_REMOVE_METHOD_SHOULD_TAKE_ONE_PARAMETER);\n            }\n\n            isWinRT = false;\n\n            if (IsWinRTEventRegistrationTokenType(addMethod.ReturnType))\n            {\n                isWinRT = true;\n\n                var pet = psr[0];\n                if (IsWinRTEventRegistrationTokenType(pet.ParameterType))\n                {\n                    throw new InvalidOperationException(Strings_Linq.EVENT_WINRT_REMOVE_METHOD_SHOULD_TAKE_ERT);","sourceCodeStart":29,"sourceCodeEnd":65,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/Rx.NET/Source/src/System.Reactive/Internal/ReflectionUtils.cs#L29-L65","documentation":"GetEventMethods validates the event's signature: the add accessor must take exactly one parameter (the event handler delegate). If psa.Length != 1 it throws InvalidOperationException 'Event add method should take one parameter'. FromEventPattern only supports standard CLR events.","triggerScenarios":"FromEventPattern against a malformed/custom event whose add method accepts zero or multiple parameters, or events defined via nonstandard metadata.","commonSituations":"Hand-written custom event-like members with wrong accessor signatures; generated/IL-rewritten events; confusing a normal method with an EventInfo-carrying member of the same name.","solutions":["Fix the event declaration so add/remove each take exactly one handler parameter (standard event pattern).","Subscribe manually instead of FromEventPattern: call add/remove yourself with lambdas and wrap in Observable.Create.","Verify you're targeting the actual event, not a similarly named field or method."],"exampleFix":"// before\n// non-standard event: add takes two parameters\nvoid add_MyEvent(EventHandler h, object tag) { ... }\n// after\nevent EventHandler MyEvent { add { ... } remove { ... } } // single handler parameter","handlingStrategy":"validation","validationCode":"var evt = targetType.GetEvent(eventName, BindingFlags.Public | BindingFlags.Instance);\nvar add = evt?.GetAddMethod();\nif (add == null || add.GetParameters().Length != 1)\n    throw new NotSupportedException($\"Event '{eventName}' is not a standard single-handler event\");","typeGuard":"static bool IsStandardEvent(Type t, string name) => t.GetEvent(name)?.GetAddMethod()?.GetParameters().Length == 1;","tryCatchPattern":"try { Observable.FromEventPattern(target, eventName, targetType); } catch (InvalidOperationException ex) when (ex.Message.Contains(\"one parameter\")) { /* subscribe manually via Observable.Create */ }","preventionTips":["Only use FromEventPattern with standard CLR events (single handler parameter).","For custom event shapes, build the observable manually with Observable.Create and explicit add/remove.","Validate event signature once at startup when event names are configuration-driven."],"tags":["reflection","event","signature"],"backgroundTag":"invalid-argument-format","analyzedSha":"94b5d5ab912789f5abe9a72138a25bbd716fe59c","analyzedAt":"2026-09-15T02:26:24.759Z","contentChangedAt":"2026-09-15T02:26:24.759Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}