JamesNK/Newtonsoft.Json · error · ArgumentException
MemberInfo '{0}' must be of type FieldInfo or PropertyInfo
Error message
MemberInfo '{0}' must be of type FieldInfo or PropertyInfo What it means
Thrown by ReflectionUtils.SetMemberValue's default case when the member is neither a Field nor a Property. Only fields and properties support value assignment through this helper; methods, events, and other members have no settable value.
Source
Thrown at Src/Newtonsoft.Json/Utilities/ReflectionUtils.cs:573
/// </summary>
/// <param name="member">The member.</param>
/// <param name="target">The target.</param>
/// <param name="value">The value.</param>
public static void SetMemberValue(MemberInfo member, object target, object? value)
{
ValidationUtils.ArgumentNotNull(member, nameof(member));
ValidationUtils.ArgumentNotNull(target, nameof(target));
switch (member.MemberType())
{
case MemberTypes.Field:
((FieldInfo)member).SetValue(target, value);
break;
case MemberTypes.Property:
((PropertyInfo)member).SetValue(target, value, null);
break;
default:
throw new ArgumentException("MemberInfo '{0}' must be of type FieldInfo or PropertyInfo".FormatWith(CultureInfo.InvariantCulture, member.Name), nameof(member));
}
}
/// <summary>
/// Determines whether the specified MemberInfo can be read.
/// </summary>
/// <param name="member">The MemberInfo to determine whether can be read.</param>
/// /// <param name="nonPublic">if set to <c>true</c> then allow the member to be gotten non-publicly.</param>
/// <returns>
/// <c>true</c> if the specified MemberInfo can be read; otherwise, <c>false</c>.
/// </returns>
public static bool CanReadMemberValue(MemberInfo member, bool nonPublic)
{
switch (member.MemberType())
{
case MemberTypes.Field:
FieldInfo fieldInfo = (FieldInfo)member;
View on GitHub (pinned to 4f73e74372)
Solutions
- Filter to FieldInfo/PropertyInfo before calling SetMemberValue.
- Use the specific member API for other kinds (MethodInfo.Invoke, EventInfo.AddEventHandler).
- Prefer GetFields()/GetProperties() over GetMembers() when iterating settable targets.
Example fix
// before
ReflectionUtils.SetMemberValue(member, target, value);
// after
switch (member)
{
case FieldInfo f: f.SetValue(target, value); break;
case PropertyInfo p: p.SetValue(target, value, null); break;
default: throw new InvalidOperationException($"Cannot set {member.MemberType}");
} Defensive patterns
Strategy: type-guard
Validate before calling
if (member is not FieldInfo and not PropertyInfo)
throw new ArgumentException($"{member.MemberType} is not settable."); Type guard
static bool IsValueWritable(MemberInfo m) => m is FieldInfo or PropertyInfo;
Prevention
- Filter to Field/Property before calling SetMemberValue.
- Use GetFields()/GetProperties() instead of GetMembers().
- Use MethodInfo.Invoke / EventInfo.AddEventHandler for other member kinds.
When it happens
Trigger: Calling SetMemberValue on a MethodInfo, EventInfo, or any member whose MemberType is not Field/Property.
Common situations: Generic member-setting utilities that iterate all members without filtering by MemberType, or code that treats methods/events as assignment targets.
Related errors
- MemberInfo '{0}' is not of type FieldInfo or PropertyInfo
- MemberInfo must be of type FieldInfo, PropertyInfo, EventInf
- Could not create getter for {0}.
- Could not create setter for {0}.
- Expected a single member with the name '{0}'.
AI-assisted analysis of JamesNK/Newtonsoft.Json@4f73e74372 (2026-08-07).
Data as JSON: /api/errors/b2350c9720968ef5.
Report an issue: GitHub.