【问题标题】:Declare an Object by Using an Object Initializer with variables通过使用带有变量的对象初始化器来声明对象
【发布时间】:2021-02-12 20:25:02
【问题描述】:

我目前正在开发 VB.NET、.NET 版本 4.7.2 和 Visual Studio 2019(Windows 窗体)。如果这是天真的错误,我对 COM 语言还是很陌生。我正在尝试使用变量声明具有对象初始化程序(等效)的对象。我想用变量做它的原因是因为这些属性存储在一个文本文件中。所以我从文件中读取这些作为键/值对(字典),然后将其分配给用于初始化对象的变量。但是,如果给我以下错误

这就是我从字典中分配变量的方式。

    Dim Servername = MyKeyValues.Item("servername")
    Dim usr = MyKeyValues.Item("username")
    Dim pwd = MyKeyValues.Item("password")

我在终端上输出值,它也以正确的大小写正确地吐出它(因为我也尝试修剪以防任何前导尾随空格)。但是当我尝试使用它来初始化对象时,我得到了底部提到的错误。

    Dim objServer As New DSSDataSource
    objServer.Name = Trim(Servername) ' Servername.Text
    objServer.Type = EnumDSSDataSourceType.DssDataSourceTypeServer
    objServer.Location = Trim(Servername) 'Servername.Text
    objServer.Mode = EnumDSSConnectionMode.DssConnectionModeServerAccess
    objServer.AuthMode = EnumDSSAuthModes.DssAuthStandard
    objServer.login = Trim(usr) 'Login.Text
    objServer.Passwd = Trim(pwd) ' Pwd.Text
    objServer.Init()

但是,当我只是简单地硬编码相同的值时,对象初始化就好了。

    Dim objServer As New DSSDataSource
    objServer.Name = "localhost" ' Servername.Text
    objServer.Type = EnumDSSDataSourceType.DssDataSourceTypeServer
    objServer.Location = "localhost" 'Servername.Text
    objServer.Mode = EnumDSSConnectionMode.DssConnectionModeServerAccess
    objServer.AuthMode = EnumDSSAuthModes.DssAuthStandard
    objServer.login = "test.usr" 'Login.Text
    objServer.Passwd = "xxx" ' Pwd.Text
    objServer.Init()

所以我不确定我哪里出错了。

【问题讨论】:

  • MyKeyValues.Item("servername") 是否包含“localhost”?
  • 没有“声明对象”之类的东西。您声明一个变量,创建一个对象并将该对象分配给该变量。此外,那里没有对象初始化程序。这是一个特定的东西,你没有使用一个。一个例子是Dim var As New SomeType With {.SomeProperty = someValue}
  • StringString,无论它来自何处。如果您硬编码String 并且它可以工作,然后您从其他地方获得String 并且它不起作用,那么您从其他地方获得的String 与硬编码的String 不同。这是 100% 保证的。你可能认为它们是相同的,但它们不是。您需要更加努力地寻找这种差异。
  • @CaiusJard - 是的,MyKeyValues.Item("servername") 值为“localhost”
  • objServer.Name = Trim(Servername) ' Servername.Text 上面写MessageBox.Show("same " & (MyKeyValues.Item("servername") = "localhost")- 它显示了什么?对登录名和密码执行相同操作

标签: .net vb.net class subprocess


【解决方案1】:

正如 CaiusJard 和 jmcilhinney 所提到的,这确实是字符串不匹配。这可能是由于一个隐藏字符,因为当我使用 ReadAll 读取文件时,它似乎也捕获了回车符。

我注意到MessageBox.Show(Servername.Length)MessageBox.Show("localhost".Length) 的长度不同。我最终不得不替换不可见的字符,以便两者匹配。它现在工作正常。谢谢两位的指导。

Dim Servername = MyKeyValues.Item("servername").Replace(Chr(13), "")

【讨论】:

  • 在将其存储到字典之前最好使用 Trim()..
  • 你可以使用内置常量vbCR(我认为)来替换字符13。它在做什么会更明显一点。
猜你喜欢
  • 2019-04-08
  • 2013-06-27
  • 2017-01-11
  • 2018-02-10
  • 2018-06-03
  • 1970-01-01
  • 2012-10-19
  • 2019-08-28
  • 1970-01-01
相关资源
最近更新 更多