2013-09-09 2 views
0

Я пытаюсь использовать callbyname для записи общей функции, которая проверяет, содержит ли целевой список (targetListName) определенный элемент перед добавлением его в список. К сожалению, я не могу понять, как использовать .contains с callbyname. Цените любую помощь!Использование callbyname для проверки list.contains (x)

Это код, который я использую сейчас. Поставка и спрос - это оба списка (строки).

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 

ответ

0

У вас может быть только словарь списков со строкой в ​​качестве ключа. Не уверен, что реальная польза от использования CallByName. Не могли бы вы подробнее рассказать о прецеденте и проблеме, которую вы пытаетесь решить?

+0

Честно говоря, это просто потому, что я ленив и предпочел бы не писать больше строк кода, если мне захочется добавить больше списков, хахахаха. Если нет способа сделать это, я думаю, мне придется придерживаться использования select ... case или словаря. Благодаря! – PostalElf

+0

Это похоже на проблему архитектуры, а затем проблему с кодом. Часто, когда мы пытаемся заставить что-то что-то сделать, оно не предназначено для решения этих проблем. Как этот бит кода вписывается в ваше общее решение? Вы нарушаете SRP или LSP от SOLID дизайнеров? Это вопросы, которые я задаю себе, когда сталкиваюсь с такими проблемами. – jcwrequests

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 предложение, если количество списков не меняется очень часто.