簡體   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