繁体   English   中英

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

[英]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);

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

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

您将看到FredFredName确实被声明为 arguments 01 变量名不存储在 IL 中。

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

IL_0003: ldstr "Fred"
IL_0008: stloc.1

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM