首頁 > 後端開發 > C++ > 我可以存取聲明範圍之外的 C# 匿名類型物件嗎?

我可以存取聲明範圍之外的 C# 匿名類型物件嗎?

DDD
發布: 2024-12-28 17:17:11
原創
755 人瀏覽過

Can I Access C# Anonymous Type Objects Outside Their Declared Scope?

存取聲明範圍之外的匿名類型物件

C# 中的匿名類型提供了一種建立輕量級臨時物件的便捷方法。但是,在聲明範圍之外存取這些物件可能具有挑戰性。

請考慮下面的範例程式碼:

void FuncB()
{
    var obj = FuncA();
    Console.WriteLine(obj.Name);
}

FuncA()
{
    var a = (from e in DB.Entities
        where e.Id == 1
        select new { Id = e.Id, Name = e.Name }).FirstOrDefault();

    return a;
}
登入後複製

這裡,在 FuncA 方法中建立了一個匿名類型對象,並且以 obj 傳回。然而,在 FuncB 方法中,編譯器抱怨 obj 不包含 Name 的定義。

為什麼我們不能存取其聲明範圍之外的匿名類型物件的屬性?

匿名型別本質上是編譯器產生的實作強型別介面的類別。建立匿名類型時,編譯器會為建立的每個唯一匿名類型產生唯一的類型名稱。這些類型對於聲明它們的組件來說是唯一的,並且無法在該組件外部存取。

我們可以在其聲明範圍之外存取匿名類型物件嗎?

從技術上講,是的。但是,由於潛在的性能損失和安全問題,強烈建議不要這樣做。

一種稱為「透過範例轉換」的方法涉及使用反射將匿名類型物件轉換為已知的範例類型。但是,此解決方案很複雜、不可靠,並且可能會隨著將來的編譯器變更而中斷。

public void FuncB()
{
    var example = new { Id = 0, Name = string.Empty };

    var obj = CastByExample(FuncA(), example);
    Console.WriteLine(obj.Name);
}
登入後複製

需要注意的是,存取聲明範圍之外的匿名類型物件可能會導致意外行為,通常不建議這樣做.

以上是我可以存取聲明範圍之外的 C# 匿名類型物件嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板