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中文網其他相關文章!