Get string property name from expression

前端 未结 4 716
暖寄归人
暖寄归人 2020-12-29 12:07

I\'m trying to write a strongly typed helper which would be something like this:

Html.Lookup(x => x.FooId);

for now I have this:

4条回答
  •  难免孤独
    2020-12-29 12:47

    Currently using this class when I need this functionality outside of web project where System.Web.Mvc reference shouldn't exist:

    namespace Interreg.Domain{
      using System;
      using System.Linq.Expressions;
      public class PropertyName{
        public static string For(
          Expression> expression){
          var body=expression.Body;
          return GetMemberName(body);
        }
        public static string For(
          Expression> expression){
          var body=expression.Body;
          return GetMemberName(body);
        }
        public static string GetMemberName(
          Expression expression){
          if(expression is MemberExpression){
            var memberExpression=(MemberExpression)expression;
            if(memberExpression.Expression.NodeType==
               ExpressionType.MemberAccess)
              return GetMemberName(memberExpression.Expression)+"."+memberExpression.Member.Name;
            return memberExpression.Member.Name;
          }
          if(expression is UnaryExpression){
            var unaryExpression=(UnaryExpression)expression;
            if(unaryExpression.NodeType!=ExpressionType.Convert)
              throw new Exception(string.Format("Cannot interpret member from {0}",expression));
            return GetMemberName(unaryExpression.Operand);
          }
          throw new Exception(string.Format("Could not determine member from {0}",expression));
        }
      }
    }
    

    Good thing about this one is - it does not lose dots when going deeper than just one level.

提交回复
热议问题