簡體   English   中英

C#委派使用對象字段的值而無需引用

[英]C# Delegate Use Object field's value without reference

我有一個在運行時定義的委托。 我希望它檢查字典是否包含特定鍵。 委托參數之一是對字典的ref ,因此字典始終是最新版本(而不是凍結副本)。

然而,關鍵是查找的object領域,但我不想給它傳遞ref到該對象。 我只想獲取字段值並像使用常量(凍結副本)一樣使用它。

這是確切的代碼段。 我將引用傳遞給netController,這使我可以使用ContainsID()檢查是否存在某些內容。 ID參數來自msg對象,但是我只想使用該值而不引用容器對象。

Func<netController, bool> resolveFunc = delegate (netController nc)
{
    return nc.ObjectRegister.ContainsID(msg.parentObjectID);
};

nc在此委托范圍內,但msg不在范圍內。 這是可行的,還是所有內容都需要作為參數傳遞?

注意:我說的是字典,但實際上是一個類似字典的對象。 ContainsID()是用於一個包裝ContainsKey() 不用擔心這部分。

這被委托稱為對變量的隱式捕獲,這絕對是可能的。

只要msg不在創建委托的行的范圍內,C#就會捕獲它,並允許您在代碼內使用它:

Func<Controller,bool> MakeChecker(Message msg) {
    return nc => nc.ObjectRegister.ContainsID(msg.parentObjectID);
}

上面的方法從創建委托的上下文中隱式捕獲msg ,而不是將其作為委托參數傳遞。 我使用lambda語法代替了匿名委托語法:

Func<Controller,bool> MakeChecker(Message msg) {
    return delegate (netController nc) {
        return nc.ObjectRegister.ContainsID(msg.parentObjectID);
    }
}

如何將其存儲到委托中?

像這樣:

Message msg = ...
Func<Controller,bool> myChecker = MakeChecker(msg);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM