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

  1. Filter to FieldInfo/PropertyInfo before calling SetMemberValue.
  2. Use the specific member API for other kinds (MethodInfo.Invoke, EventInfo.AddEventHandler).
  3. 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

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


AI-assisted analysis of JamesNK/Newtonsoft.Json@4f73e74372 (2026-08-07). Data as JSON: /api/errors/b2350c9720968ef5. Report an issue: GitHub.