我正在为我的项目寻找解决方案,我有一个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);
这声明了Fred
和FredName
。 但是,在 IL 中,这会导致:
.maxstack 2
.locals init (
[0] int32,
[1] string
)
您将看到Fred
和FredName
确实被声明,但作为参数0
和1
。 变量名称不存储在 IL 中。
此外,nameof(...)
的代码只是这样做:
IL_0003: ldstr "Fred"
IL_0008: stloc.1
将硬编码值"Fred"
加载到局部变量 1 中。
可悲的是,在这种情况下,你似乎不可能实现你想要的。