dotnet/wpf · error · NotSupportedException

SR.NotSupportedOnUnknownMember

Error message

SR.NotSupportedOnUnknownMember

What it means

XamlMemberInvoker.ThrowIfUnknown is a private guard: when the invoker belongs to XamlMember.UnknownInvoker (an unknown/unresolvable member), GetValue and SetValue throw NotSupportedException with SR.NotSupportedOnUnknownMember. Operations are meaningless on a member that could not be resolved.

Solutions

  1. Verify the member exists before use: `if (member != XamlMember.UnknownMember)` or compare `ReferenceEquals(member.Invoker, XamlMemberInvoker.UnknownInvoker)`.
  2. Fix the member name / ensure the declaring type's assembly is referenced and loadable in the schema context.
  3. Catch NotSupportedException and treat the member as absent if probing is intentional.

Example fix

// before
var member = type.GetMember("TargetName"); // typo → UnknownMember
var value = member.Invoker.GetValue(obj); // NotSupportedException
// after
var member = type.GetMember("TargetName");
if (member is null || ReferenceEquals(member.Invoker, XamlMemberInvoker.UnknownInvoker))
    return; // member not resolvable
var value = member.Invoker.GetValue(obj);
Defensive patterns

Strategy: type-guard

Validate before calling

bool usable = !ReferenceEquals(member, XamlMember.UnknownMember) && !ReferenceEquals(member.Invoker, XamlMemberInvoker.UnknownInvoker);

Type guard

static bool IsKnownMember(XamlMember m) => !ReferenceEquals(m.Invoker, XamlMemberInvoker.UnknownInvoker);

Try / catch

try { v = invoker.GetValue(instance); }
catch (NotSupportedException ex) when (ex.Message.Contains("unknown")) { /* unresolved member: treat as absent */ }

Prevention

When it happens

Trigger: Calling GetValue/SetValue on XamlMember.UnknownMember's invoker (XamlMemberInvoker.UnknownInvoker), i.e. the member came from XamlType.GetMember for a name that does not exist or a type that failed to resolve.

Common situations: Typos in member names when doing dynamic XAML member access; look-ahead code probing optional members on types from assemblies that failed to load; schema lookups in partial-trust or trimmed deployments where the type is missing.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


AI-assisted analysis of dotnet/wpf@81131a70a4 (2026-09-14). Data as JSON: /api/errors/3b21476e83dba2c5. Report an issue: GitHub.

Appendix: source

Thrown at src/Microsoft.DotNet.Wpf/src/System.Xaml/System/Xaml/Schema/XamlMemberInvoker.cs:159

                    result = (bool)shouldSerializeMethod.Invoke(instance, null);
                }

                return result ? ShouldSerializeResult.True : ShouldSerializeResult.False;
            }

            return ShouldSerializeResult.Default;
        }

        private bool IsUnknown
        {
            get { return _member is null || _member.UnderlyingMember is null; }
        }

        private void ThrowIfUnknown()
        {
            if (IsUnknown)
            {
                throw new NotSupportedException(SR.NotSupportedOnUnknownMember);
            }
        }

        private class DirectiveMemberInvoker : XamlMemberInvoker
        {
            public override object GetValue(object instance)
            {
                throw new NotSupportedException(SR.NotSupportedOnDirective);
            }

            public override void SetValue(object instance, object value)
            {
                throw new NotSupportedException(SR.NotSupportedOnDirective);
            }
        }
    }

    public enum ShouldSerializeResult

View on GitHub (pinned to 81131a70a4)