Как я могу получить доступ к переменной класса через массив в VB.NET? - PullRequest
0 голосов
/ 23 марта 2009

Если у меня есть следующий класс и объявление:

Public Class objLocation
   Public SysLocationId As String
   Public NameFull As String
   Public LatRaw As String
   Public LongRaw As String
   Public Active As Integer
End Class

dim lLocation as new objLocation

Я могу получить доступ к каждой переменной, таким образом lLocation.SysLocationId и т. Д. Есть ли альтернативный способ, чтобы я мог получить доступ к каждой переменной по индексу, например что-то вроде lLocation (0), lLocation (1) и т. Д., Что дает мне гибкость сравнения с классами того же типа с помощью цикла for для следующего или с другими источниками, например, с данными.

Ответы [ 6 ]

2 голосов
/ 23 марта 2009

Если ваша цель - сравнение, обычно вам нужно реализовать интерфейс IComparable или перегрузить операторы >, < (если требуется упорядочение) или просто оператор = (если эквивалентность необходимо).

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

0 голосов
/ 28 апреля 2011

Этот метод, который я реализовал в публичной структуре, возвращает массив строковых переменных, хранящихся в структуре:

Public Shared Function returnArrayValues() As ArrayList

    Dim arrayOutput As New ArrayList()
    Dim objInstance As New LibertyPIMVaultDefaultCategories()
    Dim t As Type = objInstance.GetType()
    Dim arrayfinfo() As System.Reflection.FieldInfo = t.GetFields()
    For Each finfo As System.Reflection.FieldInfo In arrayfinfo
        Dim str As String = finfo.GetValue(objInstance)
        arrayOutput.Add(str)
    Next

    Return arrayOutput
End Function

Поместите это в структуру или класс. Может быть, этот пример кода поможет.

0 голосов
/ 23 марта 2009

Для этого нет встроенной поддержки языка. Однако вы можете смоделировать это, создав свойство индексатора по умолчанию для класса

Public Class objLocation
  ...
Default Public ReadOnly Property Indexer(ByVal index As Integer)
    Get
        Select Case index
            Case 0
                Return SysLocationId
            Case 1
                Return NameFull
            Case 2
                Return LatRaw
            Case 3
                Return LongRaw
            Case 4
                Return Active
            Case Else
                Throw New ArgumentException
        End Select
    End Get
  End Property

Тогда вы можете использовать его следующим образом

Dim x As objLocation = GetObjLocation
Dim latRaw = x(2)
0 голосов
/ 23 марта 2009

Вы можете сделать это следующим образом. Это C # и что-то немного другое с использованием индексаторов в VB, но вы должны быть абсолютно в состоянии заставить его работать в VB.

public class ObjLocation
{
   private String[] Properties = new String[5];

   public const Int32 IndexSysLocationId = 0;
   public const Int32 IndexNameFull = 1;
   public const Int32 IndexLatRaw = 2;
   public const Int32 IndexLongRaw = 3;
   public const Int32 IndexActive = 4;

   // Repeat this for all properties
   public String SysLocationId
   {
      get { return this.Properties[ObjLocation.IndexSysLocationId]; }
      set { this.Properties[ObjLocation.IndexSysLocationId] = value; }
   }         

   public String this[Int32 index]
   {
      get { return this.Properties[index]; }
      set { this.Properties[index] = value; }
   }
}

Теперь у вас есть объект со свойствами, как и раньше, но хранится в массиве, и вы также можете получить к ним доступ через индексатор.

0 голосов
/ 23 марта 2009

Вы ищете список:

Dim LocationList As List<objLocation>;

For Each loc As objLocation In LocationList
    loc.whatever
Next

или использовать индекс:

For i = 0 To LocationList.Length - 1
    LocationList(i).whatever
Next

извините, если синтаксис VB не верен ... Я делал C # в последнее время, и нет VB

0 голосов
/ 23 марта 2009

Нет, вы не можете сделать это прямо.

Вы должны использовать отражение, чтобы получить свойства, но вы должны знать, что нет никакой гарантии порядка возвращаемых свойств (что важно, если вы хотите проиндексировать их численно).

В связи с этим вам придется поддерживать порядок сортировки при работе со свойствами (и индексами).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...