Expression parsing algorithm parameter C #, N-level call attributes, the function values, variable values, constant values,

 public static object GetValue(Expression expression)
 {
     var names = new Stack<string>();
     var exps = new Stack<Expression>();
     var mifs = new Stack<System.Reflection.MemberInfo>();
     var tempExpression = expression;
     while (tempExpression is MemberExpression)
     {
         var member = tempExpression as MemberExpression;
         names.Push(member.Member.Name);
         exps.Push(member.Expression);
         mifs.Push(member.Member);

         tempExpression = member.Expression;
     }
     if (names.Count > 0)
     {
         object value = null;
         foreach (var name in names)
         {
             var exp = exps.Pop();
             var mif = mifs.Pop();
             if (exp is ConstantExpression cex)
             {
                 value = cex.Value;
             }
             if ((mif is System.Reflection.PropertyInfo pif))
             {
                 value = pif.GetValue(value);
             }
             else if ((mif is System.Reflection.FieldInfo fif))
             {
                 value = fif.GetValue(value);
             }
         }
         return value;
     }
     else if (expression is ConstantExpression)
     {
         return (tempExpression as ConstantExpression).Value;
     }
     else
     {
         return Expression.Lambda(expression).Compile().DynamicInvoke();
     }
 }

Complete solution: https://www.cnblogs.com/chaeyeon/p/11028480.html

Guess you like

Origin www.cnblogs.com/chaeyeon/p/11162121.html