[英]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.