using System; using System.Linq.Expressions; namespace JD.MessageService { public static class MemberNameResolver { public static string ResolveMemberName(Expression> expression) { return ResolveMemberName(expression.Body); } private static string ResolveMemberName(Expression expression) { switch (expression.NodeType) { case ExpressionType.MemberAccess: var memberExpression = (MemberExpression)expression; var supername = ResolveMemberName(memberExpression.Expression); if (string.IsNullOrEmpty(supername)) { return memberExpression.Member.Name; } return string.Concat(supername, '.', memberExpression.Member.Name); case ExpressionType.Call: var callExpression = (MethodCallExpression)expression; return callExpression.Method.Name; case ExpressionType.Convert: var unaryExpression = (UnaryExpression)expression; return ResolveMemberName(unaryExpression.Operand); case ExpressionType.Parameter: return string.Empty; default: throw new ArgumentException("The expression is not a member access or method call expression"); } } } }