1

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

正如您在下面看到的,如果我没有 a stringKey,我会尝试stringKey@object( 现在它将返回"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));

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

4

3 回答 3

4

你不能。

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

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

于 2019-09-23T15:22:09.497 回答
2

这在 C# 中是不可能的。

通过调用

DPH.GetValue(dictParam, ref Browser);

您正在提供对被调用方法的对象引用。Browser在这种情况下是一个命名变量(或属性,或类字段),但在这个命名变量后面有一个对象的引用。

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

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

该方法没有得到任何变量名。

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

于 2019-09-23T15:22:19.663 回答
1

正如其他人已经说过的那样,这似乎无法实现,因为无法从调用者那里获取引用参数的名称。

不可能的原因是变量名未包含在编译的 IL 输出中。

考虑以下:

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

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

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

你会看到Fred并且FredName确实被声明了,但是作为参数01. 变量名不存储在 IL 中。

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

IL_0003: ldstr "Fred"
IL_0008: stloc.1

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

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

于 2019-09-23T15:31:19.817 回答