0

callbyname を使用して、リストに追加する前にターゲット リスト (targetListName) に特定の項目が含まれているかどうかを確認する汎用関数を作成しようとしました。残念ながら、callbyname で .contains を使用する方法がわかりません。どんな助けにも感謝します!

これは私が今使っているコードです。Supply と Demand はどちらも (文字列の) リストです。

Public Sub addItem(ByVal item As String, ByVal targetListName As String)
    Select Case targetListName.ToLower
        Case "supply"
            If supply.Contains(item) = False Then supply.Add(targetListName)
        Case "demand"
            If demand.Contains(item) = False Then supply.Add(targetListName)
        Case Else
            'bugcatch
    End Select
End Sub

理想的には、代わりに次のようなものを使用したいと思います。

Public Sub addItem(ByVal item As String, ByVal targetListName As String)
    If CallByName(Me, targetListName, [Method]).Contains(item) = false Then
        CallByName(Me, targetListName, [Set]).Add(item)
    End If
End Sub
4

2 に答える 2

0

残念ながら、CallByName機能はそのようには機能しません。http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.interaction.callbyname.aspxを参照してください。

回避策は、次のようにすることです。

Public Function getListByName(ByVal targetListName As String) As List(of Object)
    Select Case targetListName.ToLower
        Case "supply"
            return supply
        Case "demand"
            return demand
        Case Else
            'bugcatch
    End Select
    return Nothing
End Function

Public Sub addItem(ByVal item As String, ByVal targetListName As String)
    dim list As List(of Object) = GetListByName(targetListName)
    If not list.Contains(item) Then
        list.Add(item)
    End If
End Sub

または、リフレクションを使用してリストを取得することもできます。

Public Function getListByName(ByVal targetListName As String) As Object
    dim field = Me.GetType().GetField(targetListName)
    If field IsNot Nothing then
        return field.GetValue(Me)
    End If
    return Nothing
End Function

可能であれば、リストの数が頻繁に変更されない場合は、@ user2759880 の提案を使用します。

于 2013-09-09T00:33:46.957 に答える