{"record":{"id":"0d102e658fba404d","repo":"PrismLibrary/Prism","slug":"resources-propertysupport-notmemberaccessexpression","errorCode":null,"errorMessage":"Resources.PropertySupport_NotMemberAccessExpression_Exception","messagePattern":"Resources\\.PropertySupport_NotMemberAccessExpression_Exception","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Prism.Core/Mvvm/PropertySupport.cs","lineNumber":50,"sourceCode":"\n        /// <summary>\n        /// Extracts the property name from a LambdaExpression.\n        /// </summary>\n        /// <param name=\"expression\">The LambdaExpression</param>\n        /// <returns>The name of the property.</returns>\n        /// <exception cref=\"ArgumentNullException\">Thrown if the <paramref name=\"expression\"/> is null.</exception>\n        /// <exception cref=\"ArgumentException\">Thrown when the expression is:<br/>\n        ///     The <see cref=\"MemberExpression\"/> does not represent a property.<br/>\n        ///     Or, the property is static.\n        /// </exception>\n        internal static string? ExtractPropertyNameFromLambda(LambdaExpression expression)\n        {\n            if (expression == null)\n                throw new ArgumentNullException(nameof(expression));\n\n            var memberExpression = expression.Body as MemberExpression;\n            if (memberExpression == null)\n                throw new ArgumentException(Resources.PropertySupport_NotMemberAccessExpression_Exception, nameof(expression));\n\n            var property = memberExpression.Member as PropertyInfo;\n            if (property == null)\n                throw new ArgumentException(Resources.PropertySupport_ExpressionNotProperty_Exception, nameof(expression));\n\n            var getMethod = property.GetMethod;\n            if (getMethod.IsStatic)\n                throw new ArgumentException(Resources.PropertySupport_StaticExpression_Exception, nameof(expression));\n\n            return memberExpression.Member.Name;\n        }\n\n    }\n}\n","sourceCodeStart":32,"sourceCodeEnd":65,"githubUrl":"https://github.com/PrismLibrary/Prism/blob/358118cd640d9a22ff8cf21c8ad197fa038b7990/src/Prism.Core/Mvvm/PropertySupport.cs#L32-L65","documentation":"ExtractPropertyNameFromLambda throws ArgumentException with PropertySupport_NotMemberAccessExpression_Exception when the lambda body is not a MemberExpression — e.g. () => someMethod(), () => 1 + 2, or () => a + b. Only direct property accesses like () => obj.Property can be resolved to a property name.","triggerScenarios":"Passing () => SomeMethod(), () => localVariable, () => field + 1, or any computed expression to PropertySupport.ExtractPropertyName.","commonSituations":"Developers assuming any lambda works and passing method calls; capturing values in closures and passing the closure expression; using expression-bodied helpers that return computed values.","solutions":["Pass a pure property-access lambda: () => instance.PropertyName","If you need a name for a method or computed value, use nameof() instead","Verify the lambda body compiles to MemberExpression with MemberTypes.Property"],"exampleFix":"// before\nvar name = PropertySupport.ExtractPropertyName(() => GetFullName()); // method call\n// after\nvar name = PropertySupport.ExtractPropertyName(() => Person.FullName); // property access","handlingStrategy":"validation","validationCode":"if (expr.Body is not MemberExpression)\n    throw new ArgumentException(\"Expression must be a property access like () => obj.Prop\");","typeGuard":"bool IsPropertyAccess<T>(Expression<Func<T>> expr) =>\n    expr?.Body is MemberExpression;","tryCatchPattern":"try\n{\n    var name = PropertySupport.ExtractPropertyName(expr);\n}\ncatch (ArgumentException ex) when (ex.Message.Contains(\"member access\"))\n{\n    logger.LogError(ex, \"Expression {0} is not a property access\", expr);\n}","preventionTips":["Only ever pass () => obj.Property lambdas to ExtractPropertyName","Prefer nameof() for methods and computed values","Add a unit test asserting ExtractPropertyName returns the expected name"],"tags":["argumentexception","expression","lambda","mvvm","prism"],"backgroundTag":"invalid-argument-value","analyzedSha":"358118cd640d9a22ff8cf21c8ad197fa038b7990","analyzedAt":"2026-09-15T15:00:31.079Z","contentChangedAt":"2026-09-15T15:00:31.079Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}