类型安全委托属性的getter
假设我有这个简单的类:类型安全委托属性的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#中一样?
编辑:
正如我一直在问这样做,我解释什么,我想这种方法来做。我有一个应用程序每隔几秒钟读取一次系统的状态(探测过程,流程,预授权等),并将这些信息存储在建模系统的对象的某些属性中。
我想为用户提供所有定义的对象的列表,这些对象的属性可以通过这种方式更新其值。因此,用户可以设置警报规则,因此当某个属性达到某个值时,会触发警报。
为了做到这一点,我需要将代表保存到选定的属性中,以便每隔几秒检查一次它的值,并将它们与预期值进行比较。 它有道理吗?
这是在工作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默认值更改默认设置。请注意,您可能在较旧的项目中遇到一些问题;)
对不起@Hans,我不明白你的评论。你的意思是说,试图学习一种保护我免于犯这种错误的语法是一种不好的做法? – 2014-09-29 18:28:22
不,请注意答案。 – 2014-09-29 18:48:47
** 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