2014-09-29 85 views
1

假設我有這個簡單的類:類型安全委託屬性的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#中一樣?

編輯:

正如我一直在問這樣做,我解釋什麼,我想這種方法來做。我有一個應用程序每隔幾秒鐘讀取一次系統的狀態(探測過程,流程,預授權等),並將這些信息存儲在建模系統的對象的某些屬性中。

我想爲用戶提供所有定義的對象的列表,這些對象的屬性可以通過這種方式更新其值。因此,用戶可以設置警報規則,因此當某個屬性達到某個值時,會觸發警報。

爲了做到這一點,我需要將代表保存到選定的屬性中,以便每隔幾秒檢查一次它的值,並將它們與預期值進行比較。 它有道理嗎?

+0

** 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

+0

1)我想學習一個語法這樣可以保護我免於犯這類錯誤,我的意思是分配一個Function,它返回一些類型(即String)給委託,該委託需要返回其他類型的函數(即Boolean)。 2)我想獲得一個委託給一個對象實例的屬性setter,我可以在沒有該對象的情況下使用它。如果我按照你的建議來宣佈它,那麼我需要將這個對象作爲一個參數來傳遞,我可以嗎? – 2014-09-29 15:21:35

+0

你想用它達到什麼目的?是的,在理論上可以在真空中製造出一匹球形的馬...請說明你的代碼原來的問題。然後指出這種方法將如何解決它。 – Neolisk 2014-09-29 15:32:24

回答

4

這是在工作VB.NET在/著名的動態類型:

Option Strict Off 

Module Module1 
    Sub Main() 
     Dim p As New Person With {.Name = "True"} 
     Dim propGetter1 As Func(Of Boolean) = Function() p.Name 
     Dim result = propGetter1() '' Fine :) 
    End Sub 
End Module 

如果你不喜歡這樣的驚喜就用Option Strict On和編譯器會告訴你,你聽錯了在構建時間。使用工具+選項,項目和解決方案,VB默認值更改默認設置。請注意,您可能在較舊的項目中遇到一些問題;)

+0

對不起@Hans,我不明白你的評論。你的意思是說,試圖學習一種保護我免於犯這種錯誤的語法是一種不好的做法? – 2014-09-29 18:28:22

+0

不,請注意答案。 – 2014-09-29 18:48:47