Для ясности, это Не дубликат этого вопроса . Очевидно, я могу использовать оператор nameof
, чтобы получить имя переменной или параметра; Я знаю это. Но есть ли способ получить оригинальное имя переменной, переданной методу? В настоящее время я должен сделать это так:
static void Foo(string someVariable, string variableName)
{
if (!FulfilsCondition(someVariable))
Console.WriteLine($"{variableName} is bad!");
// More code
}
И я называю это так:
string bar = string.Empty;
Foo(bar, nameof(bar)); // Or...
//Foo(bar, "bar");
Но я ищу способ избежать повторного предоставления имени переменной и вместо этого использовать что-то вроде:
Foo(bar);
Где Foo
, в данном случае, будет:
static void Foo(string someVariable)
{
string variableName = GetOriginalVariableName(someVariable);
// Is this possible? ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
if (!FulfilsCondition(someVariable))
Console.WriteLine($"{variableName} is bad!");
// More code
}
Возможно ли что-то подобное в .NET?
Обновление:
Я не думал о том, что то, что передается в Foo
, может быть выражением, а не переменной, как другие предлагали в комментариях. Думая об этом сейчас, кажется, невозможно достичь того, что _ если я (каким-то образом) могу гарантировать, что всегда будет переменная? Звучит как длинный выстрел, ТБХ, но, возможно, там есть решение.
Обновление № 2:
Люди спрашивали о том, чего я на самом деле пытаюсь достичь. Ну, это очень похоже на первый метод, описанный выше, но вот метод фактический , который я использую, если это поможет:
static bool ExceedsLimit(string s, int maxLength, string variableName,
out string errorMessage)
{
if (s.Length > maxLength)
{
errorMessage = $"'{variableName}' must be {maxLength} characters at most.";
return true;
}
errorMessage = null;
return false;
}
И я использую его примерно так:
static bool TestMethod(out bool failReason)
{
if (ExceedsLimit(obj.Prop1, 100, nameof(obj.Prop1), out failReason)) return false;
if (ExceedsLimit(obj.Prop2, 50, nameof(obj.Prop2), out failReason)) return false;
if (ExceedsLimit(obj.Prop3, 80, nameof(obj.Prop3), out failReason)) return false;
// ...
}
Но я ищу способ избежать повторного предоставления имени переменной.