限制VB.NET中的严格限制

限制VB.NET中的严格限制,.net,casting,option,visitor-pattern,.net,Casting,Option,Visitor Pattern,嗨,我正在探索一些方法来实现一些类似的访问者模式,而不需要所有的装饰访问方法。到目前为止,我发现我可以在VB.NET中使用Option Strict Off,但它有一些副作用。我有一组从基类形状继承的形状类。假设我们有以下类接受的形状: Public Class ShapeAcceptor Public Sub New() MyBase.New End Sub Public Sub AcceptShape(s as Shape) AcceptAn

嗨,我正在探索一些方法来实现一些类似的访问者模式,而不需要所有的装饰访问方法。到目前为止,我发现我可以在VB.NET中使用Option Strict Off,但它有一些副作用。我有一组从基类形状继承的形状类。假设我们有以下类接受的形状:

Public Class ShapeAcceptor 
    Public Sub New()
      MyBase.New
    End Sub
    Public Sub AcceptShape(s as Shape)
      AcceptAny(s)
    End sub
    Private Sub AcceptAny(o as Object)
      Accept(o)
    End sub

    Private Sub Accept(byval s as Shape)
      Console.writeLine("Shape")
    End Sub 
    Private Sub Accept(byval s as Square)
      Console.WriteLine("Square")
    End sub
    Private Sub Accept(byval s as Circle)
      Console.writeLine("Circle")
    End Sub
    Private Sub Accept(byval s as Triangle)
      Console.writeLine("Triangle")
    End Sub  
  End Class
当“显式”选项处于禁用状态时,此选项有效。然而,一个用其他东西调用AcceptShape方法的程序会编译,但会给出一个运行时异常。我们如何将其转化为编译时错误

Public Class Application
    Public Shared Sub Main()
      Dim acceptor as new ShapeAcceptor
      Dim env as new Envelope
      For Each s  as Shape in env.Items
        acceptor.AcceptShape(s)
      Next
      acceptor.AcceptShape(new NotAShape())
     End Sub
  End Class

当您将类设置为Option Strict Off时,您告诉编译器允许对该类进行后期绑定,这很可能不是一个好主意


您可能应该做的是将其更改为Option Strict On,以便获得编译错误,随后您将停止获取运行时异常,因为它将捕获不正确的参数。

关闭
Option Strict
允许您进行后期绑定调用
接受(o)

干净的解决方案——也解决了您的运行时错误问题——是重新启用
选项Strict
,并手动执行延迟绑定调用。所以,基本上,你会替换

Public Sub AcceptShape(s as Shape)
  AcceptAny(s)
End Sub
Private Sub AcceptAny(o as Object)
  Accept(o)
End Sub

(有关详细信息,请参阅的文档。
Imports System.Reflection
用于
BindingFlags

这与Accept(o)基本相同,只是它是“optionstrict”兼容的

Public Sub AcceptShape(s as Shape)
  GetType(ShapeAcceptor).InvokeMember("Accept", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.InvokeMethod, Nothing, Me, new Object() {s})
End Sub