using System.Linq.Expressions; namespace AIStudio.Tools; public static class ExpressionExtensions { private static readonly ILogger LOGGER = Program.LOGGER_FACTORY.CreateLogger(typeof(ExpressionExtensions)); /// /// Extracts the member expression from a given lambda expression representing a property. /// /// A lambda expression specifying the property for which the member expression is to be extracted. /// The lambda expression body must represent member access. /// The type of the object containing the property referenced in the lambda expression. /// The type of the property being accessed in the lambda expression. /// The member expression that represents the property access. /// Thrown if the provided lambda expression does not represent a valid property expression. public static MemberExpression GetMemberExpression(this Expression> expression) { switch (expression.Body) { // Case for value types, which are wrapped in UnaryExpression: case UnaryExpression { NodeType: ExpressionType.Convert } unaryExpression: return (MemberExpression)unaryExpression.Operand; // Case for reference types, which are directly MemberExpressions: case MemberExpression memberExpression: return memberExpression; default: LOGGER.LogError($"Expression '{expression}' is not a valid property expression."); throw new ArgumentException($"Expression '{expression}' is not a valid property expression.", nameof(expression)); } } }