[英]How to get nameof() of the passed parameter inside of the method?
我正在为我的项目寻找解决方案,其中我有一个Dictionary<string, object>
和一个辅助方法,女巫正试图从这个字典中获取一些特定的值。
正如您在下面看到的,如果我没有stringKey
,我正在尝试从@object
获取该stringKey
(现在它将返回"object" )。 当然,我可以在打电话时做到这一点,但对我来说这看起来太糟糕了。
有没有办法在这种方法中做到这一点?
public static bool GetValue<T>(Dictionary<string, object> dict, ref T @object,
string stringKey = "")
{
if (string.IsNullOrEmpty(stringKey))
{
stringKey = nameof(@object);
}
dict.TryGetValue(stringKey, out var Object);
if (Object != null)
{
@object = (T)Object;
return true;
}
return false;
}
调用示例:
DPH.GetValue(dictParam, ref Browser);
方法中的期望是stringKey
将是"Browser" ,因为它在这种情况下:
DPH.GetValue(dictParam, ref Browser, nameof(Browser));
有特定需求,我们目前无法将该字典重构为我们的 object 或 class,可以使用nameof()
调用,但不是解决方案。
你不能。
对不起。 有一些很好的解决方法,但它们都包括完全改变你现在所做的事情。 您无法以这种方式获取变量的名称。
唯一与您想要的远程相似的是System.Runtime.CompilerServices.CallerMemberName
并且仅用于获取调用您的 function 的 function 的名称。
这在 C# 中是不可能的。
通过调用
DPH.GetValue(dictParam, ref Browser);
您正在提供对被调用方法的object 引用。 在这种情况下, Browser
是一个命名变量(或属性,或 class 字段),但在此命名变量后面有对 object 的引用。
将 object 参考视为描述 memory 某处的 object 位置的数字。
GetValue
方法获取两个这些数字(引用),并且可以使用这些数字(引用)访问对象。
该方法没有得到任何变量名。
因此,您必须使用nameof(Browser)
值作为第三个参数来提供变量的名称。 否则,无法获得名称。
正如其他人已经说过的那样,这似乎无法实现,因为无法从调用者那里获取引用参数的名称。
不可能的原因是编译的IL output中没有包含变量名。
考虑以下:
int Fred = 0;
string FredName = nameof(Fred);
这声明了Fred
和FredName
。 但是,在 IL 中,这会导致:
.maxstack 2
.locals init (
[0] int32,
[1] string
)
您将看到Fred
和FredName
确实被声明为 arguments 0
和1
。 变量名不存储在 IL 中。
此外, nameof(...)
的代码只是这样做:
IL_0003: ldstr "Fred"
IL_0008: stloc.1
将硬编码值"Fred"
加载到局部变量 1 中。
可悲的是,在这种情况下,你似乎不可能实现你想要的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.