相同的属性,不同的类型

时间:2020-03-06 15:01:56  来源:igfitidea点击:

假设我们有一个带有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成员的类,该类可让我们设置新连接或者新连接字符串。

解决方案

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

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

AFAIK,没有比这更好的了。

Let's say you have a class with a Uri property. Is there any way to get that property to accept both a string value and a Uri?

不可以,因为这意味着要有两个仅在返回类型上有所不同的getter,而.NET不允许这样做。

我将专门使用Uri方法,也许会创建一个convenienec方法来设置URI属性(给定一个字符串)。但是,由于从String到URI的转换非常简单,因此甚至没有必要。

我们不能拥有一个这样的属性,但是我们可以创建两个属性,它们都操纵相同的基础字段,就像Windows窗体中的Height / Width / Size。

另外,我们当然可以放弃重载,而只是适当地命名属性:

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

当然,我们不必制作此" WriteOnly",但这似乎是适当的。