2008-10-02 4 views
3

Предположим, у вас есть класс с собственностью Uri. Есть ли способ получить это свойство, чтобы принять как строковое значение, так и Uri? Как бы вы его построили?То же свойство, разные типы

Я не хотел бы быть в состоянии сделать что-то вроде одного из следующих, но и не поддерживаются (с использованием VB, так как он позволяет определить тип в декларации Набор для 2-го один):

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

+0

Возвращаясь к этому намного позже, вариант 1 мне даже не имеет смысла, потому что компилятор не всегда может сделать вывод о том, что нужно использовать. – 2016-12-14 02:28:05

ответ

3

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

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

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

3

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

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

Ничего лучше доступна, AFAIK.

+0

Я думаю, что вы опубликовали в то же время, что я редактировал вопрос. – 2008-10-02 15:12:47

+0

Кроме того, я бы использовал .SetLink(), чтобы использовать свойство, а не задавать поле напрямую, в случае, если свойство имеет побочные эффекты. – 2008-10-02 15:14:34

1

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

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

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

+0

Я думал только об одном геттере, который всегда возвращает Ури. Но, да, я понимаю, что MyClass.MyUriProperty = новый Uri («http://example.com») довольно прост. – 2008-10-09 21:27:14

1

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