From 9be5f9060e7b04d363614b89368986d10d036a79 Mon Sep 17 00:00:00 2001 From: Ivan Murzak Date: Wed, 25 Mar 2026 02:56:38 -0700 Subject: [PATCH 1/2] fix: add ArgumentNullException guards to BaseReflectionConverter entry points Replace cryptic NullReferenceExceptions with explicit ArgumentNullException throwing the parameter name. Guards added to TryModify, TryModifyField, TryModifyProperty, Serialize, SerializeFields, SerializeProperties, Deserialize, TryDeserializeValue, TryDeserializeValueInternal, DeserializeValueAsJsonElement, CreateInstance, and GetDefaultValue. --- .../Base/BaseReflectionConverter.DefaultValue.cs | 7 +++++-- .../Base/BaseReflectionConverter.Deserialize.cs | 13 +++++++++++++ .../Base/BaseReflectionConverter.Modify.cs | 14 ++++++++++++++ .../Base/BaseReflectionConverter.Serialize.cs | 8 ++++++++ 4 files changed, 40 insertions(+), 2 deletions(-) diff --git a/ReflectorNet/src/Converter/Reflection/Base/BaseReflectionConverter.DefaultValue.cs b/ReflectorNet/src/Converter/Reflection/Base/BaseReflectionConverter.DefaultValue.cs index ffa5f41..585e93a 100644 --- a/ReflectorNet/src/Converter/Reflection/Base/BaseReflectionConverter.DefaultValue.cs +++ b/ReflectorNet/src/Converter/Reflection/Base/BaseReflectionConverter.DefaultValue.cs @@ -43,8 +43,8 @@ public abstract partial class BaseReflectionConverter : IReflectionConverter /// Thrown when type cannot be instantiated due to constructor limitations. public virtual object? CreateInstance(Reflector reflector, Type type) { - if (type == null) - throw new ArgumentNullException(nameof(type)); + if (reflector == null) throw new ArgumentNullException(nameof(reflector)); + if (type == null) throw new ArgumentNullException(nameof(type)); // Handle enums if (type.IsEnum) @@ -155,6 +155,9 @@ public abstract partial class BaseReflectionConverter : IReflectionConverter /// An appropriate default value for the specified type. public virtual object? GetDefaultValue(Reflector reflector, Type type) { + if (reflector == null) throw new ArgumentNullException(nameof(reflector)); + if (type == null) throw new ArgumentNullException(nameof(type)); + // Handle nullable types first if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) return null; diff --git a/ReflectorNet/src/Converter/Reflection/Base/BaseReflectionConverter.Deserialize.cs b/ReflectorNet/src/Converter/Reflection/Base/BaseReflectionConverter.Deserialize.cs index f2fd6a6..1d3289e 100644 --- a/ReflectorNet/src/Converter/Reflection/Base/BaseReflectionConverter.Deserialize.cs +++ b/ReflectorNet/src/Converter/Reflection/Base/BaseReflectionConverter.Deserialize.cs @@ -59,6 +59,9 @@ public abstract partial class BaseReflectionConverter : IReflectionConverter ILogger? logger = null, DeserializationContext? context = null) { + if (reflector == null) throw new ArgumentNullException(nameof(reflector)); + if (data == null) throw new ArgumentNullException(nameof(data)); + if (!TryDeserializeValue( reflector, data: data, @@ -216,6 +219,8 @@ protected virtual bool TryDeserializeValue( Logs? logs = null, ILogger? logger = null) { + if (reflector == null) throw new ArgumentNullException(nameof(reflector)); + if (data == null) { result = null; @@ -270,6 +275,10 @@ protected virtual bool TryDeserializeValueInternal( Logs? logs = null, ILogger? logger = null) { + if (reflector == null) throw new ArgumentNullException(nameof(reflector)); + if (data == null) throw new ArgumentNullException(nameof(data)); + if (type == null) throw new ArgumentNullException(nameof(type)); + var padding = StringUtils.GetPadding(depth); if (AllowCascadeSerialization) @@ -361,6 +370,10 @@ protected virtual bool TryDeserializeValueInternal( Logs? logs = null, ILogger? logger = null) { + if (reflector == null) throw new ArgumentNullException(nameof(reflector)); + if (data == null) throw new ArgumentNullException(nameof(data)); + if (type == null) throw new ArgumentNullException(nameof(type)); + return reflector.JsonSerializer.Deserialize( reflector, data.valueJsonElement, diff --git a/ReflectorNet/src/Converter/Reflection/Base/BaseReflectionConverter.Modify.cs b/ReflectorNet/src/Converter/Reflection/Base/BaseReflectionConverter.Modify.cs index 57aa41b..0646540 100644 --- a/ReflectorNet/src/Converter/Reflection/Base/BaseReflectionConverter.Modify.cs +++ b/ReflectorNet/src/Converter/Reflection/Base/BaseReflectionConverter.Modify.cs @@ -57,6 +57,10 @@ public virtual bool TryModify( BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, ILogger? logger = null) { + if (reflector == null) throw new ArgumentNullException(nameof(reflector)); + if (data == null) throw new ArgumentNullException(nameof(data)); + if (type == null) throw new ArgumentNullException(nameof(type)); + var padding = StringUtils.GetPadding(depth); if (obj == null) @@ -256,6 +260,11 @@ protected virtual bool TryModifyField( BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, ILogger? logger = null) { + if (reflector == null) throw new ArgumentNullException(nameof(reflector)); + if (obj == null) throw new ArgumentNullException(nameof(obj)); + if (objType == null) throw new ArgumentNullException(nameof(objType)); + if (fieldValue == null) throw new ArgumentNullException(nameof(fieldValue)); + var padding = StringUtils.GetPadding(depth); if (string.IsNullOrEmpty(fieldValue.name)) @@ -371,6 +380,11 @@ protected virtual bool TryModifyProperty( BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, ILogger? logger = null) { + if (reflector == null) throw new ArgumentNullException(nameof(reflector)); + if (obj == null) throw new ArgumentNullException(nameof(obj)); + if (objType == null) throw new ArgumentNullException(nameof(objType)); + if (propertyValue == null) throw new ArgumentNullException(nameof(propertyValue)); + var padding = StringUtils.GetPadding(depth); if (string.IsNullOrEmpty(propertyValue.name)) diff --git a/ReflectorNet/src/Converter/Reflection/Base/BaseReflectionConverter.Serialize.cs b/ReflectorNet/src/Converter/Reflection/Base/BaseReflectionConverter.Serialize.cs index 4c220bb..3752084 100644 --- a/ReflectorNet/src/Converter/Reflection/Base/BaseReflectionConverter.Serialize.cs +++ b/ReflectorNet/src/Converter/Reflection/Base/BaseReflectionConverter.Serialize.cs @@ -32,6 +32,8 @@ public virtual SerializedMember Serialize( ILogger? logger = null, SerializationContext? context = null) { + if (reflector == null) throw new ArgumentNullException(nameof(reflector)); + var actualType = fallbackType ?? obj?.GetType() ?? typeof(T); return InternalSerialize( @@ -56,6 +58,9 @@ public virtual SerializedMember Serialize( ILogger? logger = null, SerializationContext? context = null) { + if (reflector == null) throw new ArgumentNullException(nameof(reflector)); + if (obj == null) throw new ArgumentNullException(nameof(obj)); + var serializedFields = default(SerializedMemberList); var objType = obj.GetType(); @@ -116,6 +121,9 @@ public virtual SerializedMember Serialize( ILogger? logger = null, SerializationContext? context = null) { + if (reflector == null) throw new ArgumentNullException(nameof(reflector)); + if (obj == null) throw new ArgumentNullException(nameof(obj)); + var serializedProperties = default(SerializedMemberList); var objType = obj.GetType(); From 10870544056dee2d42c965c8fcbaa8fd3dad9707 Mon Sep 17 00:00:00 2001 From: Ivan Murzak Date: Wed, 25 Mar 2026 03:11:06 -0700 Subject: [PATCH 2/2] fix: add ArgumentNullException guard for null data in Reflector modification method --- ReflectorNet/src/Reflector/Reflector.Modify.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ReflectorNet/src/Reflector/Reflector.Modify.cs b/ReflectorNet/src/Reflector/Reflector.Modify.cs index 96d2adf..c4619eb 100644 --- a/ReflectorNet/src/Reflector/Reflector.Modify.cs +++ b/ReflectorNet/src/Reflector/Reflector.Modify.cs @@ -43,6 +43,9 @@ public bool TryModify( BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, ILogger? logger = null) { + if (data == null) + throw new ArgumentNullException(nameof(data)); + var padding = StringUtils.GetPadding(depth); if (obj == null && data.IsNull())