Одно и то же свойство, разные типы
-
03-07-2019 - |
Вопрос
Допустим, у вас есть класс со свойством 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.