类型安全委托属性的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#中一样?

编辑:

正如我一直在问这样做,我解释什么,我想这种方法来做。我有一个应用程序每隔几秒钟读取一次系统的状态(探测过程,流程,预授权等),并将这些信息存储在建模系统的对象的某些属性中。

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

为了做到这一点,我需要将代表保存到选定的属性中,以便每隔几秒检查一次它的值,并将它们与预期值进行比较。 它有道理吗?

+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

这是在工作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