如何在方法内部获取传递参数的 nameof()?



我正在为我的项目寻找解决方案,我有一个Dictionary<string, object>和一个辅助方法女巫试图从这个字典中获取一些特定的值。

正如你在下面看到的,如果我没有stringKey,我正在尝试从@object中获取该stringKey(现在它将返回"对象">(。当然,我可以打电话,但对我来说看起来太糟糕了。

在这种方法中有什么方法可以做到这一点吗?

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将是"浏览器">

在这种情况下:
DPH.GetValue(dictParam, ref Browser, nameof(Browser));

有特定的需求,我们目前无法将该字典重构为我们的对象或类,使用nameof()调用是可能的,但不是解决方案。

你不能。

不好意思。有一些不错的解决方法,但它们都包括完全改变您现在所做的事情。您不能以这种方式获取变量的名称。

唯一与您想要的远程相似的东西是System.Runtime.CompilerServices.CallerMemberName,并且仅适用于获取调用您的函数的函数的名称。

这在 C# 中是不可能的。

通过调用

DPH.GetValue(dictParam, ref Browser);

您正在提供对被调用方法的对象引用。 在本例中,Browser是一个命名变量(或属性或类字段(,但在此命名变量后面有一个对对象的引用。

将对象引用视为描述内存中某处对象位置的数字。

GetValue方法获取两个这些数字(引用(,并可以使用这些数字(引用(访问对象。

该方法不获取任何变量名称。

因此,您必须使用nameof(Browser)值作为第三个参数来提供变量的名称。否则,无法获取名称。

正如其他人已经说过的,这似乎不可能实现,因为无法从调用方获取引用参数的名称。

之所以不可能,是因为变量名称未包含在编译的 IL 输出中。

请考虑以下事项:

int Fred = 0;
string FredName = nameof(Fred);

这声明了FredFredName。 但是,在 IL 中,这会导致:

.maxstack 2
.locals init (
[0] int32,
[1] string
)

您将看到FredFredName确实被声明,但作为参数01。 变量名称不存储在 IL 中。

此外,nameof(...)的代码只是这样做:

IL_0003: ldstr "Fred"
IL_0008: stloc.1

将硬编码值"Fred"加载到局部变量 1 中。

可悲的是,在这种情况下,你似乎不可能实现你想要的。

最新更新