получить имя переменной или параметра [дубликат]
Возможные Дубликаты:
поиск имени переменной, переданной функции в 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 ответа:
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();
вы можете кэшировать значения свойств для дальнейшего повышения производительности, поскольку имена свойств не меняются во время выполнения.
подход к выражению будет медленнее на мой вкус. Получить имя и значение параметра вместе за один раз см. это мой ответ