Вопрос

Допустим, у вас есть класс со свойством 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 WriteOnly Property UriString() As String
    Set(ByVal value As String)
        m_Uri = new Uri(value)
    End Set
End Property

Конечно, вам не обязательно это делать WriteOnly но кажется уместным.

Другие советы

Я думаю, вам просто нужно предоставить сопроводительное письмо.

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

Ничего лучше не существует, AFAIK.

Допустим, у вас есть класс со свойством Uri.Есть ли способ заставить это свойство принимать как строковое значение, так и Uri?

Нет, потому что это означало бы наличие двух геттеров, которые различаются только типом возвращаемого значения, а это не разрешено в .NET.

я бы использовал Uri исключительно метод и, возможно, создать удобный метод для установки URI свойство, заданное строкой.Однако с момента перехода из String к URI это просто, даже это может быть ненужным.

У вас не может быть одного такого свойства, но вы можете создать два свойства, которые будут манипулировать одним и тем же базовым полем - точно так же, как Высота/Ширина/Размер в Windows Forms.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top