2012-02-15 23 views
2

好的,所以我是C#編碼器,甚至在閱讀VB.NET時遇到困難,所以請原諒可能是一個令人難以置信的愚蠢問題。但是,我有一些代碼,看起來像這樣:VB.NET如何將其解析爲對象屬性?

Function GetName(sourceObject as Object) as String 
    return sourceObject.Name 
End Function 

所以,無視事實,語法可能是錯誤的 - 如何VB.NET得到sourceObject Name屬性?在運行時檢查它顯示sourceObject是一種支持名爲帶有getter的屬性的類型,但VB.NET在這種情況下做了什麼?是否有一些額外的代碼由編譯器以某種方式在運行時以自動方式進行強制轉換?

正如你所能說的,我有點困惑。提前致謝!

回答

6

這是後期綁定的情況。因此,如果sourceObject包含一個名爲Name的屬性,它將返回該值,否則它只會拋出該屬性未找到的錯誤。

在C#中的後期綁定需要反射,因此它會引發編譯時錯誤,而在vb.net中,它可以在沒有反射的情況下完成。

當 對象分配給對象變量時,Visual Basic編譯器執行一個稱爲綁定的過程。當一個對象被分配給一個聲明爲特定對象 類型的變量時,該對象是早期綁定的 。早期綁定的對象允許編譯器分配內存,並在應用程序執行之前執行其他優化。相比之下,當一個對象被分配給一個聲明爲Object類型的變量 時,該對象會被延遲。這種類型的對象可以容納任何對象的引用。

+0

好的謝謝 - 但有沒有一個參考的地方,可以確切地描述它是如何工作的?因爲我需要將此代碼轉換爲C#,並且我想以一種理智的方式複製功能(即儘可能不使用反射)... – 2012-02-15 11:43:56

+0

已在此msdn鏈接http://msdn.microsoft.com /en-us/library/0tcf61s1.aspx – Harsh 2012-02-15 11:45:16

+0

這將幫助你在C#中進行後期綁定http://kristofmattei.be/2010/02/11/c-late-binding/ – Harsh 2012-02-15 11:47:19

3

如果你使用的是C#4.0,那麼你可以試試這個。

return ((dynamic)SourceObject).Name; 
1

只要知道VB的延遲綁定繞過類型檢查與您的編譯器。如果傳入的對象沒有Name屬性,則可能會在運行時引發異常。

+0

是的,完全意識到這一點。這就是爲什麼我想了解它是如何工作的,所以我可以擺脫這種行爲。 – 2012-02-18 11:24:16

2

由於內在的後期綁定,Object類型的所有VB變量都等價於已轉換爲動態的c#對象 - 或者換句話說,c#添加動態以獲得VB的功能奇偶校驗。

所以,等效C#代碼將((dynamic) sourceObject).Name

我會去了解一下與泛型或者如果可能的接口這樣做,因爲那是一個更清潔的設計。

+0

是的,我打算用強大的打字重新做它,但在我重構某些東西之前,我想知道它究竟是如何操作的。 – 2012-02-17 19:53:48

相關問題