Свойство Set Overload Array vs. Non-Array - PullRequest
1 голос
/ 11 февраля 2010

Я пытаюсь создать свойство, которое позволит установить фамилию на основе различных входных данных. Код, который вызывает это, анализирует поле имени. В некоторых случаях он будет иметь одну фамилию, в других - массив фамилий, которые необходимо объединить. Я хочу хранить свой код конкатенации в одном месте, чтобы упростить обслуживание.

Вот мой код, который, конечно, не работает:

        Public Property LastName() As String
        Get
            Return _LastName
        End Get
        Set(ByVal value As String)
            _LastName = value
        End Set
    End Property

    Public WriteOnly Property LastName() As String()
        Set(ByVal value As String())
            For Each word As String In value
                _LastName &= word & " "
            Next

            _LastName = _LastName.Trim
        End Set
    End Property

Я пробовал многочисленные варианты этого, даже помещая несколько Set в одно и то же свойство, но, похоже, ничего не работает. Должен быть какой-то способ получить массив и одно значение экземпляра. Компилятор четко знает, является ли входящий объект массивом или нет.

Я пытался работать только со свойством типа String (), но потом не могу вернуть String. Единственное решение, которое я могу придумать, это свойства с разными именами, которые затрудняют использование класса, или целая куча подпрограмм и функций, перегружающих друг друга.

Предложения

Chris

Ответы [ 3 ]

2 голосов
/ 11 февраля 2010

Вы не можете перегрузить свойства, поэтому свойство может быть либо string, либо string(), но не обоими.

Рассмотрим другое имя для свойства string():

Public WriteOnly Property LastNameArray() As String()
    Set(ByVal value As String())
        For Each word As String In value
            _LastName &= word & " "
        Next

        _LastName = _LastName.Trim
    End Set
End Property
0 голосов
/ 11 февраля 2010

Что-то вроде этого:

        Public Property LastName() As Object
        Get
            Return _LastName
        End Get
        Set(ByVal value As Object)
            If TypeOf (value) Is Array Then
                For Each word As String In value
                    _LastName &= word & " "
                Next

                _LastName = _LastName.Trim

            End If
            If TypeOf (value) Is String Then
                _LastName = value
            End If
        End Set
    End Property

Кто-нибудь видит проблему с этим?

0 голосов
/ 11 февраля 2010

Если ваш вывод будет другого типа, чем ваш, вы не можете использовать свойство для него. Нет ничего плохого в том, чтобы использовать функцию для нее, хорошая практика скажет, что у вас есть имя функции (LastName), и к ней добавляется глагол (Get), так что вы получите функцию anme, такую ​​как GetLastName.

Public  Function GetLastName(ByVal names As String()) As String

(простите мой очень ржавый VB, если что-то явно не так)

...