【问题标题】:How to get original expression for method parameter passed by value?如何获取按值传递的方法参数的原始表达式?
【发布时间】:2015-05-02 12:07:04
【问题描述】:

代码示例:

public class A{
    public void Check(bool condition){
        Console.WriteLine(???);
    }
    public void Test_1(){
        Check(2 > 3);
    }
    public void Test_2(){
        int x=3;
        Check(x != 6);
    }
}

我需要在方法检查中写入控制台不是参数条件的值,而是它的原始表达式。例如,当在程序中调用方法 Test_1 时,我想在控制台“2 > 3”上看到。当在程序中调用 Test_2 方法时,我希望在控制台“x!= 6”上看到。

【问题讨论】:

  • 将表达式传递给Check方法中的字符串类型参数
  • 正如@Adil 所说,现在Check 只接收“true”或“false”,仅此而已。
  • 您可以将条件作为 lambda 传递,然后使用 Expression 将 lambda 的主体转换为字符串。
  • 旁注:查看Fluent Assertions,这可能就是您所追求的。
  • 这听起来像xy 问题。为什么需要方法参数值?您无法从反射中获取方法参数值。您必须使用调试/分析 API。您可以获取参数名称和类型,但不能获取参数本身。

标签: c# methods parameter-passing


【解决方案1】:

您可以在 Check 中使用System.Linq.Expressions 作为参数,这将允许您使用 lambda 传递表达式。获得 Lambda 表达式后,您可以使用 LambdaExpression.Body 以字符串形式获取表达式。

public static void Check(int n1, int n2, Expression<Func< int, int, bool>> exp)
{
   var compiled = exp.Compile();                      
   Console.WriteLine("Expression: " + exp.Body.ToString() + "\t Result: " + compiled.Invoke(n1,n2)); 
}

public void Test_1(){
    int a = 2, b = 3;
   Check(a,b, (x,y)=>x > y);
}

public void Test_2(){
   int a=3;
   int b=6;
   Check(a,b, (x,y)=> x != y);
}

void Main()
{
    Test_1();
    Test_2();
}

输出

Expression: (x > y)   Result: False 
Expression: (x != y)  Result: True

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多