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
- Filter to FieldInfo/PropertyInfo before calling GetMemberValue.
- Handle other member kinds via their specific GetValue/Invoke APIs.
- 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
- Filter to Field/Property before calling GetMemberValue.
- Use GetFields()/GetProperties() instead of GetMembers().
- Handle methods/events via their own Invoke/AddEventHandler APIs.
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
- MemberInfo '{0}' must be 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/71194a12fb05d5ea.
Report an issue: GitHub.