Такое же свойство, разные типы

Скажем, у вас есть класс с свойством 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, который позволяет вам установить, например, новое соединение или новую строку соединения.

4 ответа

В качестве альтернативы вы можете, конечно, отказаться от перегрузки и просто назвать свойства соответствующим образом:

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 исключительно и, возможно, создал метод convenienec для установки свойства Uri, заданного строкой. Однако, поскольку преобразование из String в Uri является простым, даже это может быть ненужным.


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

licensed under cc by-sa 3.0 with attribution.