JamesNK/Newtonsoft.Json · error · ArgumentException

MemberInfo '{0}' is not of type FieldInfo or PropertyInfo

Error message

MemberInfo '{0}' is not of type FieldInfo or PropertyInfo

What it means

Thrown by ReflectionUtils.GetMemberValue's default case when the member is neither a Field nor a Property. Only fields and properties can be read as values through this helper; methods, events, and other members fall through.

Source

Thrown at Src/Newtonsoft.Json/Utilities/ReflectionUtils.cs:549

        {
            ValidationUtils.ArgumentNotNull(member, nameof(member));
            ValidationUtils.ArgumentNotNull(target, nameof(target));

            switch (member.MemberType())
            {
                case MemberTypes.Field:
                    return ((FieldInfo)member).GetValue(target);
                case MemberTypes.Property:
                    try
                    {
                        return ((PropertyInfo)member).GetValue(target, null);
                    }
                    catch (TargetParameterCountException e)
                    {
                        throw new ArgumentException("MemberInfo '{0}' has index parameters".FormatWith(CultureInfo.InvariantCulture, member.Name), e);
                    }
                default:
                    throw new ArgumentException("MemberInfo '{0}' is not of type FieldInfo or PropertyInfo".FormatWith(CultureInfo.InvariantCulture, member.Name), nameof(member));
            }
        }

        /// <summary>
        /// Sets the member's value on the target object.
        /// </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);

View on GitHub (pinned to 4f73e74372)

Solutions

  1. Filter to FieldInfo/PropertyInfo before calling GetMemberValue.
  2. Handle other member kinds via their specific GetValue/Invoke APIs.
  3. Use GetFields() and GetProperties() instead of the broad GetMembers().

Example fix

// before
var v = ReflectionUtils.GetMemberValue(member, target);

// after
var v = member switch
{
    FieldInfo f    => f.GetValue(target),
    PropertyInfo p => p.GetValue(target, null),
    _ => throw new InvalidOperationException($"Cannot read {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 value-bearing.");

Type guard

static bool IsValueReadable(MemberInfo m) => m is FieldInfo or PropertyInfo;

Prevention

When it happens

Trigger: Calling GetMemberValue on a MethodInfo, EventInfo, or any member whose MemberType is not Field/Property.

Common situations: Generic member-walking utilities that iterate GetMembers() without filtering by MemberType, or code that assumes all members are value-bearing.

Related errors


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