dotnet/reactive · error · ArgumentNullException

nameof(eventName)

Error message

nameof(eventName)

What it means

ArgumentNullException from FromEventPattern(object target, string eventName, IAsyncScheduler scheduler) when eventName is null. The operator resolves the event by name via reflection on target's type; a null (or empty) name cannot be looked up and is rejected up front with a parameter-naming exception.

Solutions

  1. Pass a valid event name string, e.g. "Click"; verify it exists on target's type via Type.GetEvent.
  2. Guard with string.IsNullOrEmpty before calling.
  3. Prefer the typed FromEventPattern<TEventArgs>(add, remove) overloads to avoid reflection-by-name entirely.

Example fix

// before
var obs = AsyncObservable.FromEventPattern(btn, eventName); // eventName == null
// after
var eventName = nameof(btn.Click);
var obs = AsyncObservable.FromEventPattern(btn, eventName);
Defensive patterns

Strategy: validation

Validate before calling

if (string.IsNullOrEmpty(eventName)) throw new ArgumentException("Event name required", nameof(eventName));
if (target?.GetType().GetEvent(eventName) is null) throw new MissingMemberException(eventName);

Type guard

bool IsValidEventName(string n) => !string.IsNullOrEmpty(n);

Try / catch

try
{
    var obs = AsyncObservable.FromEventPattern(target, eventName);
}
catch (ArgumentNullException ex) when (ex.ParamName == nameof(eventName))
{
    logger.LogError(ex, "Event name missing when binding to {Type}", target?.GetType());
}

Prevention

When it happens

Trigger: Calling FromEventPattern(target, null) or (target, null, scheduler) — typically the event name was read from config/reflection and never assigned, or a typo'd constant resolved to null.

Common situations: Event names stored in app settings or resources where the key is missing; string literals refactored into constants that were not initialized; dynamic plugin scenarios where the metadata lacks the event name.

Related errors


AI-assisted analysis of dotnet/reactive@94b5d5ab91 (2026-09-15). Data as JSON: /api/errors/dbe968e327f403cb. Report an issue: GitHub.

Appendix: source

Thrown at AsyncRx.NET/System.Reactive.Async/Linq/Operators/FromEventPattern.cs:99

        {
            if (addHandler == null)
                throw new ArgumentNullException(nameof(addHandler));
            if (removeHandler == null)
                throw new ArgumentNullException(nameof(removeHandler));
            if (scheduler == null)
                throw new ArgumentNullException(nameof(scheduler));

            return FromEvent<EventHandler<TEventArgs>, object, TEventArgs>(action => ConvertDelegate<Action<object, TEventArgs>, EventHandler<TEventArgs>>(action), addHandler, removeHandler, scheduler).Select(t => new EventPattern<TEventArgs>(t.arg1, t.arg2));
        }

        public static IAsyncObservable<EventPattern<object>> FromEventPattern(object target, string eventName) => FromEventPattern(target, eventName, GetSchedulerForCurrentContext());

        public static IAsyncObservable<EventPattern<object>> FromEventPattern(object target, string eventName, IAsyncScheduler scheduler)
        {
            if (target == null)
                throw new ArgumentNullException(nameof(target));
            if (eventName == null)
                throw new ArgumentNullException(nameof(eventName));
            if (scheduler == null)
                throw new ArgumentNullException(nameof(scheduler));

            return FromEventPatternCore<object, object, EventPattern<object>>(target.GetType(), target, eventName, scheduler, (o, e) => new EventPattern<object>(o, e));
        }

        public static IAsyncObservable<EventPattern<TEventArgs>> FromEventPattern<TEventArgs>(object target, string eventName) => FromEventPattern<TEventArgs>(target, eventName, GetSchedulerForCurrentContext());

        public static IAsyncObservable<EventPattern<TEventArgs>> FromEventPattern<TEventArgs>(object target, string eventName, IAsyncScheduler scheduler)
        {
            if (target == null)
                throw new ArgumentNullException(nameof(target));
            if (eventName == null)
                throw new ArgumentNullException(nameof(eventName));
            if (scheduler == null)
                throw new ArgumentNullException(nameof(scheduler));

            return FromEventPatternCore<object, TEventArgs, EventPattern<TEventArgs>>(target.GetType(), target, eventName, scheduler, (o, e) => new EventPattern<TEventArgs>(o, e));

View on GitHub (pinned to 94b5d5ab91)