假設我有這個簡單的類:類型安全委託屬性的getter
Public Class Person
Public Property Name() As String
Public Property Married() As Boolean
End Class
我想創建一個委託給它的屬性獲取。有點搜索,包括this之後,我寫了這個代碼在VB.NET:
Dim p As New Person()
p.Name = "Joe"
p.Married = True
Dim propGetter1 As Func(Of Boolean) = Function() p.Married
Dim propGetter2 As Func(Of String) = Function() p.Name
和檢索屬性的值,如下所示:
Dim married as Boolean = propGetter1.Invoke
Dim name as String = propGetter2.Invoke
它工作正常,但相反在從上面的鏈接C#的例子,它不會在編譯時檢查由該函數返回的類型,所以我可以只寫這樣的代碼:
Dim propGetter1 As Func(Of Boolean) = Function() p.Name
獲得一個運行時錯誤。
我也試過這樣的代碼:
Dim propGetter3 As Func(Of String) = Function(p As Person) p.Name
,但我得到了以下錯誤:
嵌套函數不具有簽名與委託「System.Func(布爾兼容)'
那麼,如何在編譯時使用類型檢查來編寫這個委託,就像在C#中一樣?
編輯:
正如我一直在問這樣做,我解釋什麼,我想這種方法來做。我有一個應用程序每隔幾秒鐘讀取一次系統的狀態(探測過程,流程,預授權等),並將這些信息存儲在建模系統的對象的某些屬性中。
我想爲用戶提供所有定義的對象的列表,這些對象的屬性可以通過這種方式更新其值。因此,用戶可以設置警報規則,因此當某個屬性達到某個值時,會觸發警報。
爲了做到這一點,我需要將代表保存到選定的屬性中,以便每隔幾秒檢查一次它的值,並將它們與預期值進行比較。 它有道理嗎?
** 1)**除非您的名稱是「True」或「False」,否則名稱如何成爲布爾值? 'Dim propGetter1 As Func(Of Boolean)= Function()p.Name' ** 2)**'Func(Of String)'應該是'Func(Of Person,String)' – 2014-09-29 15:14:53
1)我想學習一個語法這樣可以保護我免於犯這類錯誤,我的意思是分配一個Function,它返回一些類型(即String)給委託,該委託需要返回其他類型的函數(即Boolean)。 2)我想獲得一個委託給一個對象實例的屬性setter,我可以在沒有該對象的情況下使用它。如果我按照你的建議來宣佈它,那麼我需要將這個對象作爲一個參數來傳遞,我可以嗎? – 2014-09-29 15:21:35
你想用它達到什麼目的?是的,在理論上可以在真空中製造出一匹球形的馬...請說明你的代碼原來的問題。然後指出這種方法將如何解決它。 – Neolisk 2014-09-29 15:32:24