• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

maiden

Percorrer a lista de variáveis de uma página / classe

7 mensagens neste tópico

Boas,

Tenho uma série de atributos de uma classe e preciso de fazer a mesma verificação para todos os campos. A minha ideia era percorrer todas as variáveis presentes na classe (através do nome da variável, por exemplo) como se tivesse a percorrer a lista de controlos da página, e aí utilizar apenas um ciclo que verificaria todas as variáveis. Algo do género

for each var in me.variables.collection
    if x>0 then
        var("nome") = valor 
    end if
next

O problema é encontrar a tal colecção de variáveis, começo a pensar que não existe mesmo :/

Outra ideia que me surgiu foi utilizar uma variável do tipo dicionário, dactilografar todos os nomes das variáveis e respectivos valores, tipo dicionario("nomeVar",valor), mas não consigo depois utilizar o nome da variável para fazer a atribuição do valor.

Alguém já teve um problema semelhante?

Obrigado desde já

Cumps,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Explica lá melhor. Não entendi o que queres e se mostrares um exemplo do que tens, talvés seja mais simples.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok, o meu problema é que tenho uma classe com bastantes atributos, que estou posteriormente a utilizar para alimentar labels.

Public Class xpto

Public dataElaboracao As String
Public dataRecepcao As String
Public dataSolicRecolha As String
Public dataRecolha As String
Public dataTransporte As String
Public dataRecepcaoDest As String
...
...
...

Depois criei uma DataTable, um DataAdapter e um comando para ligar à Base de dados e colocar os valores de uma determinada tabela na DataTable criada anteriormente. Neste momento tenho uma DataTable com o conteudo dessa tabela da BD, mas o meu objectivo era fazer corresponder cada campo da DataTable aos atributos criados anteriormente, verificando ainda se os campos se encontram preenchidos ou Null

If Not dtEncomenda.DefaultView.Item(0)("campo_data1") Is DBNull.Value Then
    dataElaboracao = dtEncomenda.DefaultView.Item(0)("campo_data1")
End If
If Not dtEncomenda.DefaultView.Item(0)("campo_data2") Is DBNull.Value Then
    dataRecepcao = dtEncomenda.DefaultView.Item(0)("campo_data2")
End If
If Not dtEncomenda.DefaultView.Item(0)("campo_data3") Is DBNull.Value Then
    dataSolicRecolha = dtEncomenda.DefaultView.Item(0)("campo_data3")
End If
If Not dtEncomenda.DefaultView.Item(0)("campo_data4") Is DBNull.Value Then
    dataRecolha = dtEncomenda.DefaultView.Item(0)("campo_data4")
End If
If Not dtEncomenda.DefaultView.Item(0)("campo_data5") Is DBNull.Value Then
    dataTransporte = dtEncomenda.DefaultView.Item(0)("campo_data5")
End If
If Not dtEncomenda.DefaultView.Item(0)("campo_data6") Is DBNull.Value Then
    dataRecepcaoDest = dtEncomenda.DefaultView.Item(0)("campo_data6")
End If
...
...

O que eu queria fazer era aceder a estas variáveis através do seu nome, tipo variáveis de sessão (Session("nome")) e assim utlizava tipo um array de dupla entrada com o nome da variável e o respectivo valor, de forma a utilizar apenas um ciclo para verificar a condição anterior, em vez de necessitar de 50 linhas de código para fazer algo simples, ficaria algo do género:

for each linha in array
    If Not dtEncomenda.DefaultView.Item(0)(linha(campo)) Is DBNull.Value Then
        atributo_correspondente_ao_campo = dtEncomenda.DefaultView.Item(0)(linha(campo))
    End If

Ou seja, em vez de atribuir directamente o valor a uma variável, queria aceder à mesma através do seu nome, por exemplo, de forma a percorrer o array com os nomes de todas as variáveis e atribuir a essa mesma variável o valor que lhe corresponde, automatizando o processo e reduzindo o número de linhas de código.

Foi por isso que dei o exemplo dos controlos, pois estes possuem uma coleccção, tornando mais fácil o acesso a eles. A minha ideia inicial era um acesso idêntico, para o caso de existir uma colecção semelhante para as variáveis (que até agora não descobri).

Penso ter sido mais explicito.

Obrigado.

Cumps,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isto anda-me a dar a volta à cabeça :wallbash:

O que eu queria era algo semelhante a este código em php, retirado do site php.net

class MyClass
{
    public $var1 = 'value 1';
    public $var2 = 'value 2';
    public $var3 = 'value 3';

    function iterate() {
       foreach($this as $key => $value) {
           print "$key => $value\n";
       }
    }
}

$class = new MyClass();
$class->iterate();

Com o seguinte Output:

var1 => value 1
var2 => value 2
var3 => value 3

Neste caso já poderia verificar o nome da variável, comparando o valor de $key com o nome da variável em questão.

Agora falta-me arranjar um código idêntico em ASP.NET :smoke:

Cumps,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá,

Desculpa o atraso da resposta, mas vê lá se é isto:

Tens um classe:

Public Class myNewClass

    Public total As Integer = 200
    Private subtotal As Long = 55

    Private _valor As Integer
    Public Property valor() As Integer
        Get
            Return _valor
        End Get
        Set(ByVal value As Integer)
            _valor = value
        End Set
    End Property

End Class

E queres ir buscar as variáveis e os seus valores, é isso ? Se for isso tens de usar o Reflection, +/- isto:

Imports System.Reflection

   	 Dim obj As Object = New myNewClass
        Dim myType As Type = GetType(myNewClass)

        Dim myFieldInfo As FieldInfo
        Dim myFieldInfos() As FieldInfo

        myFieldInfos = myType.GetFields(BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.Public)

        For Each myFieldInfo In myFieldInfos
            Debug.WriteLine(String.Empty)
            Debug.WriteLine("Variável: " + myFieldInfo.Name)
            Debug.WriteLine("Classe: " + myFieldInfo.DeclaringType.Name.ToString)
            Debug.WriteLine("Publica: " + myFieldInfo.IsPublic.ToString)
            Debug.WriteLine("Tipo: " + myFieldInfo.FieldType.ToString)
            Debug.WriteLine(myFieldInfo.GetValue(obj).ToString)
        Next

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Parece ser mesmo isso.

Ainda não experimentei, mas deve existir um método SetValue também, para acesso do género

For Each myFieldInfo In myFieldInfos
    Debug.WriteLine(myFieldInfo.SetValue(obj).ToString)
Next

Vou testar.

jpaulino mais uma vez obrigado :thumbsup:

Cumps,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ainda não experimentei, mas deve existir um método SetValue também, para acesso do género

Cumps,

Sim existe. Existe o GetValue() e o SetValue()

jpaulino mais uma vez obrigado

De nada! Se tiveres dúvidas a implementar diz qualquer coisa.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora