假设我有这个简单的类:
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中这样做,我需要将委托保存到所选属性,因此我可以每隔几秒检查一次它的值,并将它们与预期值进行比较。 它有意义吗?
答案 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默认值更改默认设置。请注意,您可能在旧项目中遇到一些问题;)