2009-03-23 2 views
0

Если у меня есть следующий класс и декларации:Как получить доступ к переменной класса через массив в VB.NET?

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) и т. д., что дает мне возможность сравнивать классы одного и того же типа с помощью следующего цикла или с другими источниками, такими как данные.

+0

Венгерская нотация на имя класса ... Это просто не так. Класс не является объектом! – Welbog

+0

Венгерский в любом месте .Net не прав. –

ответ

0

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

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

Все они были отличными ответами, но я думаю, что это лучше всего подходит для того, что я хочу сделать, а именно: циклически перебирать переменные классов по индексу, получать значения, а затем назначать их базе данных. – CDM

0

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

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

Из-за этого вам придется сохранять порядок сортировки согласованным при работе со свойствами (и индексами).

0

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

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

Вы можете сделать это следующим образом. Это 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; } 
    } 
} 

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

2

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

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

0

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

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 

Поместите его в конструкцию или класс. Возможно, этот пример кода помогает.