确定用作方法参数的变量的名称

时间:2009-04-12 20:21:55

标签: c# reflection parameters

您如何在C#中确定调用方法时使用的变量的名称?

示例:

public void MyTestMethod1()
{
  string myVar = "Hello World";
  MyTestMethod2(myVar);
}

public void MyMethod2(string parm)
{
  // do some reflection magic here that detects that this method was called using a variable called 'myVar'
}

我理解参数可能并不总是变量,但我使用它的地方是在一些验证代码中,我希望dev可以显式地声明它们正在验证的值的友好名称,如果他们不会那么只是从他们用方法调用方法的var的名称推断它...

4 个答案:

答案 0 :(得分:6)

有一种方法,但它非常难看。

public void MyTestMethod1()
{
  string myVar = "Hello World";
  MyTestMethod2(() => myVar);
}

public void MyMethod2(Expression<Func<string>> func)
{
  var localVariable = (func.Body as MemberExpression).Member.Name;
  // localVariable == "myVar"
}

正如你所看到的,你所有的调用都必须包含在lambda中,如果你在lambda中开始做任何其他事情,除了返回一个变量之外,这个方法就会崩溃。

答案 1 :(得分:4)

不幸的是,即使不是不可能的话,这也会非常困难。

为什么你需要最初发送的变量的名称?

请记住,可能没有使用实际变量:

MyMethod2(myVar + "! 123");

在这种情况下,myVar只包含部分值,其余部分在运行时在表达式中计算。

答案 2 :(得分:1)

变量是指为实体分配语义含义的方便标识符。以编程方式编写它们就像你描述的方式似乎是一个非常大的代码味道。此外,如果知道真的那么重要,你难道不能传递第二个参数吗?


编辑:OP更新了他的问题以包含这一行:

  

我知道参数可能并不总是变量,但是我使用它的地方是在某些验证代码中我希望dev可以显式地声明它们验证的值的友好名称,如果他们不这样做,那么它只是从他们用方法调用方法的var的名称推断它...

如果他们明确说明并且这对你很重要,那么它绝对应该作为参数传递给函数。

答案 3 :(得分:1)

听起来我应该使用Enum作为变量的标识符,而不是试图确定变量的名称。变量的全部意义在于它只是一个人类可读的名称来表示一点内存。

你可以这样做:

public void MyTestMethod1()
{
  string myVar = "Hello World";
  MyTestMethod2(myVar, VariableType.MyVar);
}

public void MyMethod2(string parm, VariableType type)
{
  if (type == VariableType.MyVar)
  {
  }
}