получить имя переменной или параметра [дубликат]


Возможные Дубликаты:
поиск имени переменной, переданной функции в C#

Я хотел бы получить имя переменной или параметра:

например, если у меня есть:

var myInput = "input";

var nameOfVar = GETNAME(myInput); // ==> nameOfVar should be = myInput

void testName([Type?] myInput)
{
   var nameOfParam = GETNAME(myInput); // ==> nameOfParam should be = myInput
}

Как я могу сделать это в C#?

3 70
c#

3 ответа:

Pre C# 6.0 solution

вы можете использовать это, чтобы получить имя данного члена:

public static class MemberInfoGetting
{
    public static string GetMemberName<T>(Expression<Func<T>> memberExpression)
    {
        MemberExpression expressionBody = (MemberExpression)memberExpression.Body;
        return expressionBody.Member.Name;
    }
}

чтобы получить имя переменной:

string testVariable = "value";
string nameOfTestVariable = MemberInfoGetting.GetMemberName(() => testVariable);

чтобы получить имя параметра:

public class TestClass
{
    public void TestMethod(string param1, string param2)
    {
        string nameOfParam1 = MemberInfoGetting.GetMemberName(() => param1);
    }
}

C# 6.0 и выше решение

можно использовать nameof оператор для параметров, переменных и свойств:

string testVariable = "value";
string nameOfTestVariable = nameof(testVariable);

то, что вы передаете GETNAME это стоимостью на myInput, а не определение myInput сам по себе. Единственный способ сделать это - с помощью лямбда-выражения, например:

var nameofVar = GETNAME(() => myInput);

и действительно есть примеры того, что доступно. Однако! Это пахнет делать что-то очень неправильно. Я бы предложил вам переосмыслить почему тебе это нужно. Это почти наверняка не хороший способ сделать это, и заставляет различные накладные расходы (класс захвата экземпляр и дерево выражений). Кроме того, это влияет на компилятор: без этого компилятор мог бы фактически выбрать удалить эту переменную полностью (просто используя стек без формального локального).

кроме того,

1) не трогая System.Reflection пространство имен

GETNAME(new { myInput });

public static string GETNAME<T>(T myInput) where T : class
{
    if (myInput == null)
        return string.Empty;

    return myInput.ToString().TrimStart('{').TrimEnd('}').Split('=')[0].Trim();
}

2) ниже один может быть быстрее, хотя (из моих тестов)

GETNAME(new { variable });
public static string GETNAME<T>(T myInput) where T : class
{
    if (myInput == null)
        return string.Empty;

    return typeof(T).GetProperties()[0].Name;
}

вы также можете расширить это свойства объектов (может быть с методами расширения):

new { myClass.MyProperty1 }.GETNAME();

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

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