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

  1. Fix the event declaration so add/remove each take exactly one handler parameter (standard event pattern).
  2. Subscribe manually instead of FromEventPattern: call add/remove yourself with lambdas and wrap in Observable.Create.
  3. 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

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


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)