dotnet/reactive · error · InvalidOperationException
Strings_Linq.EVENT_ADD_METHOD_SHOULD_TAKE_ONE_PARAMETER
Error message
Strings_Linq.EVENT_ADD_METHOD_SHOULD_TAKE_ONE_PARAMETER
What it means
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.
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.
Example fix
// before
// non-standard event: add takes two parameters
void add_MyEvent(EventHandler h, object tag) { ... }
// after
event EventHandler MyEvent { add { ... } remove { ... } } // single handler parameter Defensive patterns
Strategy: validation
Validate before calling
var evt = targetType.GetEvent(eventName, BindingFlags.Public | BindingFlags.Instance);
var add = evt?.GetAddMethod();
if (add == null || add.GetParameters().Length != 1)
throw new NotSupportedException($"Event '{eventName}' is not a standard single-handler event"); Type guard
static bool IsStandardEvent(Type t, string name) => t.GetEvent(name)?.GetAddMethod()?.GetParameters().Length == 1;
Try / catch
try { Observable.FromEventPattern(target, eventName, targetType); } catch (InvalidOperationException ex) when (ex.Message.Contains("one parameter")) { /* subscribe manually via Observable.Create */ } Prevention
- 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.
When it happens
Trigger: FromEventPattern against a malformed/custom event whose add method accepts zero or multiple parameters, or events defined via nonstandard metadata.
Common situations: 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.
Understand the failure class
Background: "Invalid ... format", "must be in format X", "does not look like a ..." — invalid argument format errors across CLI tools and libraries — this error's family across 17 libraries.
Related errors
- Strings_Linq.COULD_NOT_FIND_INSTANCE_EVENT
- Strings_Linq.COULD_NOT_FIND_STATIC_EVENT
- Strings_Linq.EVENT_MISSING_ADD_METHOD
- Strings_Linq.EVENT_MISSING_REMOVE_METHOD
- An event should either have add and remove methods that…
AI-assisted analysis of dotnet/reactive@94b5d5ab91 (2026-09-15).
Data as JSON: /api/errors/255076c6239b77b0.
Report an issue: GitHub.
Appendix: source
Thrown at Rx.NET/Source/src/System.Reactive/Internal/ReflectionUtils.cs:47
if (target == null)
{
e = targetType.GetEvent(eventName, BindingFlags.Public | BindingFlags.Static)
?? throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, Strings_Linq.COULD_NOT_FIND_STATIC_EVENT, eventName, targetType.FullName));
}
else
{
e = targetType.GetEvent(eventName, BindingFlags.Public | BindingFlags.Instance)
?? throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, Strings_Linq.COULD_NOT_FIND_INSTANCE_EVENT, eventName, targetType.FullName));
}
addMethod = e.GetAddMethod() ?? throw new InvalidOperationException(Strings_Linq.EVENT_MISSING_ADD_METHOD);
removeMethod = e.GetRemoveMethod() ?? throw new InvalidOperationException(Strings_Linq.EVENT_MISSING_REMOVE_METHOD);
var psa = addMethod.GetParameters();
if (psa.Length != 1)
{
throw new InvalidOperationException(Strings_Linq.EVENT_ADD_METHOD_SHOULD_TAKE_ONE_PARAMETER);
}
var psr = removeMethod.GetParameters();
if (psr.Length != 1)
{
throw new InvalidOperationException(Strings_Linq.EVENT_REMOVE_METHOD_SHOULD_TAKE_ONE_PARAMETER);
}
isWinRT = false;
if (IsWinRTEventRegistrationTokenType(addMethod.ReturnType))
{
isWinRT = true;
var pet = psr[0];
if (IsWinRTEventRegistrationTokenType(pet.ParameterType))
{
throw new InvalidOperationException(Strings_Linq.EVENT_WINRT_REMOVE_METHOD_SHOULD_TAKE_ERT);View on GitHub (pinned to 94b5d5ab91)