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
- Pass a valid event name string, e.g. "Click"; verify it exists on target's type via Type.GetEvent.
- Guard with string.IsNullOrEmpty before calling.
- 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
- Replace event-name magic strings with nameof() expressions.
- Validate configured event names against Type.GetEvent at startup.
- Prefer delegate-based overloads to eliminate reflection-by-name failures.
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)