【问题标题】:How to avoid late binding in this case?在这种情况下如何避免后期绑定?
【发布时间】:2019-03-26 19:31:42
【问题描述】:

这是一个单一类、单一表单的袖珍应用程序,可导航到特定网站、登录并下载为我们放置的文件。只支持 Chrome 一切都很好,但我们办公室的用户可以使用 Chrome 或 Firefox,所以我不得不以这种方式适应。

Public Class Form1

    Private browser As Object

    Private Sub doLogin()
        Me.ToolStripStatusLabel1.Text = "Logging in"
        If My.Settings.UserBrowser Is BrowserChrome Then
            Dim Options = New ChromeOptions
            'Set options
            Dim driverService = ChromeDriverService.CreateDefaultService()
            driverService.HideCommandPromptWindow = True
            browser = New ChromeDriver(driverService, Options)
        Else
            Dim Options = New FirefoxOptions
            'Set options
            Dim driverService = FirefoxDriverService.CreateDefaultService()
            driverService.HideCommandPromptWindow = True
            browser = New FirefoxDriver(driverService, Options)
        End If
        browser.Url = "https://www.example.com"
        browser.Navigate()

现在,browser 当然是后期绑定的,但是除了一直为每个浏览器复制代码之外,我不知道如何避免这里的后期绑定。

【问题讨论】:

    标签: vb.net oop binding


    【解决方案1】:

    假设这是 Selenium,那么 FirefoxDriver 和 ChromeDriver 都以 RemoteWebDriver 作为其基础,但也以 WebDriver 作为接口。

    这真的很重要。

    接口使您可以访问共享方法和属性,而无需知道已实现类的显式版本。并且接口被认为是早期绑定的,因为可以进行方法调用,而无需搜索可能的候选方法列表,也无需使用 System.Reflection 来确定类实际可以做什么。

    Private browser As WebDriver
    
    Private Sub doLogin()
        Me.ToolStripStatusLabel1.Text = "Logging in"
        If My.Settings.UserBrowser Is BrowserChrome Then
            Dim Options = New ChromeOptions
            'Set options
            Dim driverService = ChromeDriverService.CreateDefaultService()
            driverService.HideCommandPromptWindow = True
            browser = New ChromeDriver(driverService, Options)
        Else
            Dim Options = New FirefoxOptions
            'Set options
            Dim driverService = FirefoxDriverService.CreateDefaultService()
            driverService.HideCommandPromptWindow = True
            browser = New FirefoxDriver(driverService, Options)
        End If
        browser.Url = "https://www.example.com"
        browser.Navigate()
        ' Do other things... 
    End Sub
    

    【讨论】:

      【解决方案2】:

      当一个对象是动态的或未知的,这是你的情况,只会在运行时绑定,这就是你所看到的。基本上,编译器不知道包含方法和属性的对象类型或对象类型,因此它绕过了编译时检查。您可以做的就是将其转换为适当的类型...

      Private browser As Object = Nothing
      
      Private Sub doLogin()
          Me.ToolStripStatusLabel1.Text = "Logging in"
          If My.Settings.UserBrowser Is BrowserChrome Then
              Dim Options = New ChromeOptions
              'Set options
              Dim driverService = ChromeDriverService.CreateDefaultService()
              driverService.HideCommandPromptWindow = True
              browser = New ChromeDriver(driverService, Options)
          Else
              Dim Options = New FirefoxOptions
              'Set options
              Dim driverService = FirefoxDriverService.CreateDefaultService()
              driverService.HideCommandPromptWindow = True
              browser = New FirefoxDriver(driverService, Options)
          End If
      
          If TypeOf browser Is ChromeDriver Then
             CType(browser, ChromeDriver).Url = "https://www.example.com"
             CType(browser, ChromeDriver).Navigate()
          ElseIf TypeOf browser Is FirefoxDriver Then
             CType(browser, FirefoxDriver).Url = "https://www.example.com"
             CType(browser, FirefoxDriver).Navigate()
          End If
      
      End Sub
      

      或者另一种可能……

       CType(browser, If(TypeOf browser Is ChromeDriver, ChromeDriver, FirefoxDriver)).Url = "https://www.example.com"
       CType(browser, If(TypeOf browser Is ChromeDriver, ChromeDriver, FirefoxDriver)).Navigate()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-21
        • 1970-01-01
        • 2013-07-17
        相关资源
        最近更新 更多