{"record":{"id":"dbe968e327f403cb","repo":"dotnet/reactive","slug":"nameof-eventname","errorCode":null,"errorMessage":"nameof(eventName)","messagePattern":"nameof\\(eventName\\)","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Linq/Operators/FromEventPattern.cs","lineNumber":99,"sourceCode":"        {\n            if (addHandler == null)\n                throw new ArgumentNullException(nameof(addHandler));\n            if (removeHandler == null)\n                throw new ArgumentNullException(nameof(removeHandler));\n            if (scheduler == null)\n                throw new ArgumentNullException(nameof(scheduler));\n\n            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));\n        }\n\n        public static IAsyncObservable<EventPattern<object>> FromEventPattern(object target, string eventName) => FromEventPattern(target, eventName, GetSchedulerForCurrentContext());\n\n        public static IAsyncObservable<EventPattern<object>> FromEventPattern(object target, string eventName, IAsyncScheduler scheduler)\n        {\n            if (target == null)\n                throw new ArgumentNullException(nameof(target));\n            if (eventName == null)\n                throw new ArgumentNullException(nameof(eventName));\n            if (scheduler == null)\n                throw new ArgumentNullException(nameof(scheduler));\n\n            return FromEventPatternCore<object, object, EventPattern<object>>(target.GetType(), target, eventName, scheduler, (o, e) => new EventPattern<object>(o, e));\n        }\n\n        public static IAsyncObservable<EventPattern<TEventArgs>> FromEventPattern<TEventArgs>(object target, string eventName) => FromEventPattern<TEventArgs>(target, eventName, GetSchedulerForCurrentContext());\n\n        public static IAsyncObservable<EventPattern<TEventArgs>> FromEventPattern<TEventArgs>(object target, string eventName, IAsyncScheduler scheduler)\n        {\n            if (target == null)\n                throw new ArgumentNullException(nameof(target));\n            if (eventName == null)\n                throw new ArgumentNullException(nameof(eventName));\n            if (scheduler == null)\n                throw new ArgumentNullException(nameof(scheduler));\n\n            return FromEventPatternCore<object, TEventArgs, EventPattern<TEventArgs>>(target.GetType(), target, eventName, scheduler, (o, e) => new EventPattern<TEventArgs>(o, e));","sourceCodeStart":81,"sourceCodeEnd":117,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Linq/Operators/FromEventPattern.cs#L81-L117","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":"// before\nvar obs = AsyncObservable.FromEventPattern(btn, eventName); // eventName == null\n// after\nvar eventName = nameof(btn.Click);\nvar obs = AsyncObservable.FromEventPattern(btn, eventName);","handlingStrategy":"validation","validationCode":"if (string.IsNullOrEmpty(eventName)) throw new ArgumentException(\"Event name required\", nameof(eventName));\nif (target?.GetType().GetEvent(eventName) is null) throw new MissingMemberException(eventName);","typeGuard":"bool IsValidEventName(string n) => !string.IsNullOrEmpty(n);","tryCatchPattern":"try\n{\n    var obs = AsyncObservable.FromEventPattern(target, eventName);\n}\ncatch (ArgumentNullException ex) when (ex.ParamName == nameof(eventName))\n{\n    logger.LogError(ex, \"Event name missing when binding to {Type}\", target?.GetType());\n}","preventionTips":["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."],"tags":["argument-null","csharp","reflection","reactive-extensions"],"backgroundTag":"null-argument","analyzedSha":"94b5d5ab912789f5abe9a72138a25bbd716fe59c","analyzedAt":"2026-09-15T02:26:24.759Z","contentChangedAt":"2026-09-15T02:26:24.759Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}