Get the parameter value from a Linq Expression

前端 未结 3 602
别跟我提以往
别跟我提以往 2021-01-01 16:21

I have the following class

public class MyClass
{
    public bool Delete(Product product)
    {
        // some code.
    }
}

Now I have a

3条回答
  •  谎友^
    谎友^ (楼主)
    2021-01-01 17:01

    This method works pretty well. It returns the argument types and values for an Expression>

        private static KeyValuePair[] ResolveArgs(Expression> expression)
        {
            var body = (System.Linq.Expressions.MethodCallExpression)expression.Body;
            var values = new List>();
    
            foreach (var argument in body.Arguments)
            {
                var exp = ResolveMemberExpression(argument);
                var type = argument.Type;
    
                var value = GetValue(exp);
    
                values.Add(new KeyValuePair(type, value));
            }
    
            return values.ToArray();
        }
    
        public static MemberExpression ResolveMemberExpression(Expression expression)
        {
    
            if (expression is MemberExpression)
            {
                return (MemberExpression)expression;
            }
            else if (expression is UnaryExpression)
            {
                // if casting is involved, Expression is not x => x.FieldName but x => Convert(x.Fieldname)
                return (MemberExpression)((UnaryExpression)expression).Operand;
            }
            else
            {
                throw new NotSupportedException(expression.ToString());
            }
        }
    
        private static object GetValue(MemberExpression exp)
        {
            // expression is ConstantExpression or FieldExpression
            if (exp.Expression is ConstantExpression)
            {
                return (((ConstantExpression)exp.Expression).Value)
                        .GetType()
                        .GetField(exp.Member.Name)
                        .GetValue(((ConstantExpression)exp.Expression).Value);    
            }
            else if (exp.Expression is MemberExpression)
            {
                return GetValue((MemberExpression)exp.Expression);
            }
            else
            {
                throw new NotImplementedException();
            }
        }
    

提交回复
热议问题