Допустим, у вас есть класс со свойством 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.
Я думаю, вы разместили в то же самое время, когда я редактировал вопрос.
Кроме того, я бы реализовал .SetLink (), чтобы использовать свойство, а не устанавливать поле напрямую, на случай, если свойство имеет побочные эффекты.
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?
Нет, потому что это будет означать наличие двух геттеров, которые различаются только типом возвращаемого значения, а это запрещено в .NET.
Я бы использовал исключительно метод Uri и, возможно, создал бы удобный метод для установки свойства URI с учетом строки. Однако, поскольку преобразование с String в URI выполняется просто, даже в этом может быть нет необходимости.
Я думал только об одном геттере, который всегда возвращает Uri. Но да, я понимаю, что MyClass.MyUriProperty = new Uri ("example.com ") довольно прост
У вас не может быть одного такого свойства, но вы можете создать два свойства, которые управляют одним и тем же базовым полем - точно так же, как Высота / Ширина / Размер в Windows Forms.
В качестве альтернативы вы, конечно, можете отказаться от перегрузки и просто назвать свойства соответствующим образом:
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
Принял этот ответ, потому что мне в конечном итоге также нужно, чтобы этот класс был сериализуемым, что означает наличие имущество, который сериализатор может видеть и использовать.
Возвращаясь к этому гораздо позже, вариант 1 для меня больше не имеет смысла, потому что компилятор не всегда может сделать вывод о правильном использовании Get.