明確にするために、これはこの質問の複製ではありません。明らかに、演算子を使用して変数またはパラメーターの名前を取得できます。そんなこと知ってる。しかし、メソッドに渡された変数の元の名前を取得する方法はありますか? 現在、私はこのようにする必要があります: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
変数ではなく式である可能性については考えていませんでした。今考えてみると、常に変数が存在することを (どういうわけか) 保証できない限り、何を達成することはできないように思われますか? ロングショットのように聞こえますが、TBH には解決策があるかもしれません。
更新 #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;
// ...
}
しかし、変数の名前を繰り返し提供することを避ける方法を探しています。