{"record":{"id":"ef83c4440c17292a","repo":"dotnet/reactive","slug":"nameof-type","errorCode":null,"errorMessage":"nameof(type)","messagePattern":"nameof\\(type\\)","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Linq/Operators/FromEventPattern.cs","lineNumber":139,"sourceCode":"\n        public static IAsyncObservable<EventPattern<TSender, TEventArgs>> FromEventPattern<TSender, 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<TSender, TEventArgs, EventPattern<TSender, TEventArgs>>(target.GetType(), target, eventName, scheduler, (o, e) => new EventPattern<TSender, TEventArgs>(o, e));\n        }\n\n        public static IAsyncObservable<EventPattern<object>> FromEventPattern(Type type, string eventName) => FromEventPattern(type, eventName, GetSchedulerForCurrentContext());\n\n        public static IAsyncObservable<EventPattern<object>> FromEventPattern(Type type, string eventName, IAsyncScheduler scheduler)\n        {\n            if (type == null)\n                throw new ArgumentNullException(nameof(type));\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>>(type, null, eventName, scheduler, (o, e) => new EventPattern<object>(o, e));\n        }\n\n        public static IAsyncObservable<EventPattern<TEventArgs>> FromEventPattern<TEventArgs>(Type type, string eventName) => FromEventPattern<TEventArgs>(type, eventName, GetSchedulerForCurrentContext());\n\n        public static IAsyncObservable<EventPattern<TEventArgs>> FromEventPattern<TEventArgs>(Type type, string eventName, IAsyncScheduler scheduler)\n        {\n            if (type == null)\n                throw new ArgumentNullException(nameof(type));\n            if (eventName == null)\n                throw new ArgumentNullException(nameof(eventName));\n            if (scheduler == null)\n                throw new ArgumentNullException(nameof(scheduler));","sourceCodeStart":121,"sourceCodeEnd":157,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Linq/Operators/FromEventPattern.cs#L121-L157","documentation":"This is an ArgumentNullException raised by the static-event overload FromEventPattern(Type type, string eventName, IAsyncScheduler scheduler) when the type argument is null. This overload subscribes to static .NET events via reflection on the given Type, so a null Type cannot be reflected over and is rejected synchronously before any observable is created.","triggerScenarios":"Calling the public FromEventPattern(Type type, string eventName) or explicit-scheduler overload (AsyncRx.NET/System.Reactive.Async/Linq/Operators/FromEventPattern.cs:139) with type == null, e.g. passing the result of Type.GetType(\"Bad.Namespace.Type\") which returns null when the type name/assembly is wrong.","commonSituations":"Type.GetType with a mistyped or assembly-unqualified name returning null; loading types from plugins where the assembly failed to load; reflection-based registration code that forwards a null type it obtained elsewhere.","solutions":["Use typeof(SenderType) instead of a string-based Type lookup to get a compile-time-guaranteed non-null Type","If using Type.GetType, verify the assembly-qualified name and check the result for null before calling FromEventPattern","Ensure plugin/reference assemblies are present so the type actually resolves"],"exampleFix":"// before\nvar t = Type.GetType(\"MyApp.Services.Messenger\"); // null: wrong namespace\nvar events = AsyncObservable.FromEventPattern(t, \"MessageReceived\");\n// after\nvar events = AsyncObservable.FromEventPattern(typeof(MyApp.Services.Messenger), \"MessageReceived\");","handlingStrategy":"validation","validationCode":"if (type is null)\n    throw new ArgumentNullException(nameof(type), \"Event source type not resolved\");\nvar obs = AsyncObservable.FromEventPattern(type, eventName);","typeGuard":"static bool HasSourceType([NotNullWhen(true)] Type? t) => t is not null;","tryCatchPattern":"try\n{\n    var obs = AsyncObservable.FromEventPattern(type, eventName);\n}\ncatch (ArgumentNullException ex) when (ex.ParamName == \"type\")\n{\n    // string-based Type lookup failed; log the bad type name\n    throw new TypeLoadException($\"Could not resolve event source type '{typeByName}'\", ex);\n}","preventionTips":["Prefer typeof(X) over Type.GetType strings","When Type.GetType is required, use assembly-qualified names and null-check the result","Verify plugin assemblies load before reflecting their types","Unit-test dynamic type resolution for every configured type name"],"tags":["argument-null","reflection","static-event","fromeventpattern","dotnet"],"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"}