Определить имя переменной, используемой в качестве параметра метода - PullRequest
2 голосов
/ 13 апреля 2009

Как бы вы в 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'
}

Я понимаю, что параметр не всегда может быть переменной, но я использую его в некотором коде проверки, где я надеюсь, что разработчик может либо явно указать понятное имя для значения, которое они проверяют, и тогда они этого не делают, просто выводят его из имени переменной, с которой они вызвали метод ...

Ответы [ 4 ]

6 голосов
/ 13 апреля 2009

Есть способ, но довольно уродливый.

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"
}

Как вы можете видеть, все ваши вызовы должны были бы быть заключены в лямбды, и этот метод не работает, если вы начинаете делать что-то еще в лямбда-выражениях, кроме возврата одной переменной.

4 голосов
/ 13 апреля 2009

К сожалению, это будет очень сложно, если не невозможно.

Почему именно вам нужно имя переменной, изначально отправленной в?

Помните, что фактическая переменная может не использоваться:

MyMethod2(myVar + "! 123");

В этом случае myVar содержит только части значения, остальное вычисляется в выражении во время выполнения.

1 голос
/ 16 апреля 2009

Мне кажется, что вы должны использовать Enum в качестве идентификатора для вашей переменной, а не пытаться определить имя вашей переменной. Весь смысл переменной в том, что это просто удобочитаемое имя, представляющее немного памяти.

Вы можете сделать:

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

public void MyMethod2(string parm, VariableType type)
{
  if (type == VariableType.MyVar)
  {
  }
}
1 голос
/ 13 апреля 2009

Под переменными подразумеваются удобные идентификаторы, которые присваивают смысловые значения сущностям. Программно они, как вы описываете, кажутся довольно сильным запахом кода. Кроме того, если это действительно так важно знать, не могли бы вы просто передать второй параметр?

<Ч />

Редактировать: ОП обновил свой вопрос, чтобы включить эту строку:

Я понимаю, что параметр не всегда может быть переменной, но я использую его в некотором коде проверки, где Я надеюсь, что разработчик может явно указать понятное имя проверяемого значения , и если они этого не делают, то это просто выводит его из имени переменной, с которой они вызвали метод ...

Если они прямо заявили об этом, и это важно для вас, это определенно должно быть передано в качестве параметра функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...