类型安全委托给属性getter

时间:2014-09-29 15:07:15

标签: vb.net delegates compile-time typechecking

假设我有这个简单的类:

Public Class Person
    Public Property Name() As String
    Public Property Married() As Boolean
End Class

我想为其属性getter创建一个委托。经过一些搜索,包括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(Of Boolean)'

那么,我怎么能在编译时用类型检查来编写这个委托,就像在C#中一样?

修改

当我被要求这样做时,我会解释我尝试用这种方法做什么。我有一个应用程序,每隔几秒读取一个系统的状态(探测测量,流动,预先安排......),并将这些信息存储在模拟系统的对象的某些属性中。

我想为用户提供一个列出所有定义的对象,这些对象具有以这种方式更新其值的属性。因此,用户可以设置警报规则,因此当属性达到特定值时,将触发警报。

在orden中这样做,我需要将委托保存到所选属性,因此我可以每隔几秒检查一次它的值,并将它们与预期值进行比较。 它有意义吗?

1 个答案:

答案 0 :(得分: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默认值更改默认设置。请注意,您可能在旧项目中遇到一些问题;)