【问题标题】:Same property, different types相同的属性,不同的类型
【发布时间】:2008-10-02 15:09:40
【问题描述】:

假设您有一个具有 Uri 属性的类。有没有办法让该属性同时接受字符串值和 Uri?您将如何构建它?

我希望能够执行以下操作之一,但都不支持(使用 VB,因为它允许您在 Set 声明中为第二个指定类型):

Class MyClass

    Private _link As Uri

   'Option 1: overloaded property
    Public Property Link1 As Uri
        Get
            return _link
        End Get
        Set(ByVal value As Uri)
           _link = value
        End Set
    End Property

    Public Property link1 As String
        Get
            return _link.ToString()
        End Get
        Set(Byval value As String)
           _link = new Uri(value)
        End Set
   End Property

   ' Option 2: Overloaded setter
   Public Property link2 As Uri
      Get
          return _link
      End Get
      Set(Byval value As Uri)
          _link = value
      End Set
      Set(Byval value As String)
          _link = new Uri(value)
      End Set
End Class

考虑到这些可能不会很快得到支持,否则您会如何处理呢?我正在寻找比仅仅提供额外的.SetLink(string value) 方法更好的东西,而且我仍在使用.Net2.0(尽管如果以后的版本对此有很好的功能,我想听听) .

我可以想到您可能希望提供这种重载的其他场景:例如,具有 SqlConnection 成员的类允许您设置新连接或新连接字符串。

【问题讨论】:

  • 稍后再谈,选项 1 对我来说甚至不再有意义,因为编译器可能并不总是能够推断出正确的 Get to use。

标签: .net .net-2.0 properties overloading


【解决方案1】:

或者,您当然可以放弃重载并适当地命名属性:

Public WriteOnly Property UriString() As String
    Set(ByVal value As String)
        m_Uri = new Uri(value)
    End Set
End Property

当然你不必做这个WriteOnly,但它看起来很合适。

【讨论】:

  • 我可能不会去 WriteOnly;如果我们要走这条路,一路走,并提供一个读取版本,如: Get Return m_Uri.ToString() End Get
  • 接受了这个答案,因为我最终还需要这个类是可序列化的,这意味着具有序列化程序可以看到和使用的 属性
【解决方案2】:

我想你只需要提供一个伴随

Public Sub SetLink(ByVal value as String)
    _link = new Uri(value)
End Sub

没有比这更好的了,AFAIK。

【讨论】:

  • 我想你是在我编辑问题的同时发布的。
  • 另外,我会实现 .SetLink() 来使用属性而不是直接设置字段,以防属性有副作用。
【解决方案3】:

假设您有一个具有 Uri 属性的类。有没有办法让该属性同时接受字符串值和 Uri?

不,因为这意味着有两个 getter,它们的返回类型仅不同,而这在 .NET 中是不允许的。

我会专门使用Uri 方法,并且可能会创建一个方便的方法来设置URI 属性,给定一个字符串。但是,由于从StringURI 的转换很简单,因此可能没有必要这样做。

【讨论】:

  • 我在想只有一个总是返回 Uri 的吸气剂。但是,是的,我意识到 MyClass.MyUriProperty = new Uri("example.com") 非常简单
【解决方案4】:

您不能拥有一个这样的属性,但您可以创建两个都操作相同基础字段的属性 - 就像 Windows 窗体中的高度/宽度/大小一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 2021-07-24
    • 2021-06-22
    • 2018-11-03
    • 2017-02-19
    • 1970-01-01
    • 2014-12-13
    相关资源
    最近更新 更多