REFLECTION / EXPRESSAO LAMBDA QUAL A SOLUCAO IDEAL

FOXMAN 08/12/2011 19:31:56
#390918
Boa tarde amigos,

Venho recorrer a ajuda de voces, pois acho que cheguei a um ponto que não consigo obter uma resposta a minha dúvida.

A pergunta é :

é possivel obter o valor atribuido de uma propriedade em uma classe sem a utilização de LOOPs ???

Explico :

Vou pegar como exemplo a estrutura de classes a seguir(Com base na NFe) :

Det.Item(0).Imposto.Icms

Det.Item(0).Imposto.Icms.ICMS10

Det.Item(0).Imposto.Icms.ICMS20

Det.Item(0).Imposto.Icms.ICMS30

Det.Item(0).Imposto.Icms.ICMS40

.

.

.

Det.Item(0).Imposto.Icms.ICMSSN900



A Classe Icms retorna uma lista de ICMSs(icms00,icms10,icms20,icms30......), porém apenas um deles foi atribuido valor(uma vez que cada produto tem apenas um icmsXX atribuido).

Eu gostaria de pegar/saber, apenas o icmsxxx que foi atribuido

Em modo Debug na janela imediata obtive a seguinte lista :

?Det.Item(0).Imposto.Icms
{BSSystemControl_Net.ICMS}
_Icms00: Nothing
_Icms10: Nothing
_Icms101: Nothing
_Icms102: Nothing
_Icms103: Nothing
_Icms20: Nothing
_Icms201: Nothing
_Icms202: {BSSystemControl_Net.ICMSSN202}
_Icms203: Nothing
_Icms30: Nothing
_Icms300: Nothing
_Icms40: Nothing
_Icms400: Nothing
_Icms500: Nothing
_Icms51: Nothing
_Icms60: Nothing
_Icms70: Nothing
_Icms90: Nothing
_Icms900: Nothing
_Icmsst: Nothing
Icms00: Nothing
Icms10: Nothing
Icms101: Nothing
Icms102: Nothing
Icms103: Nothing
Icms20: Nothing
Icms201: Nothing
Icms202: {BSSystemControl_Net.ICMSSN202}
Icms203: Nothing
Icms30: Nothing
Icms300: Nothing
Icms40: Nothing
Icms400: Nothing
Icms500: Nothing
Icms51: Nothing
Icms60: Nothing
Icms70: Nothing
Icms90: Nothing
Icms900: Nothing
Icmsst: Nothing

A grosso modo da para saber que apenas o ICMS202 teve valor atribuido.

Utilzando Expressão Lambda eu consigo saber entre diversos RadioButton,
qual deles foi checado sem utilizar loop explicitamente, conforme abaixo :

groupBox1.Controls.OfType<RadioButton>().First(p => p.Checked).Name.ToString()

é possível executar expressão lambda em classes para saber qual valor foi setado ??? ou ainda.

é possível utilizar Reflection para saber qual propriedade foi setada ???

é isso....

Desde já agradeço...

KERPLUNK 08/12/2011 19:52:41
#390923
Reflection, pegando todas as variáveis de uma classe:
PropertyInfo[] propriedades = typeof(SUA_CLASSE).GetProperties(BindingFlags.Public | BindingFlags.Static);

FOXMAN 08/12/2011 20:00:28
#390925
Citação:

:
Reflection, pegando todas as variáveis de uma classe:
PropertyInfo[] propriedades = typeof(SUA_CLASSE).GetProperties(BindingFlags.Public | BindingFlags.Static);


Kerplunk até ae tudo bem eu conseigo pegar as propriedades, setar e tals, isso eu já faço , mas o que eu desejo é saber qual das propriedades foi setada...



KERPLUNK 08/12/2011 22:57:31
#390935
Com uma única expressão, não vai dar não. O que pode fazer é percorrer a classe original(com os dados inalterados) e comparar propriedade por propriedade(tente dizer isso rápido, 3 vezes seguidas) com o objeto alterado...
FOXMAN 09/12/2011 09:51:39
#390950
Citação:

:
Com uma única expressão, não vai dar não. O que pode fazer é percorrer a classe original(com os dados inalterados) e comparar propriedade por propriedade(tente dizer isso rápido, 3 vezes seguidas) com o objeto alterado...



Não é possível que não haja forma.
Se for para dar um loop, fica sem graça....kkkkkkkkkkkkkkkk

O tópico vai ficar aberto, e vou fuçar , pesquisar, postar em foruns e tals.


FOXMAN 09/12/2011 15:55:15
#390990
Humm,me parece uma solução, porém tentei converter para vb.net e não consegui.
Tu chegou a testar o codigo em C# ??, pois se funfou posso adicionar uma função em uma classe em c# que tenho neste projeto.

Consegues converter para vb.net ???

FOXMAN 09/12/2011 16:22:42
#390992
Eu testei aqui em C# e funcionou.
Porém não consegui fazer funcionar em vb.net.

To tentando aqui, qq coisa eu te chamo.
LLAIA 09/12/2011 16:42:34
#390993
Poxa, no estágio um colega me ajudou com um problema parecido com esse usando expressão lambda, só que agora num lembro como foi. Só segunda-feira mesmo pra ver o código.
FOXMAN 09/12/2011 17:09:27
#391000
Citação:

:
Poxa, no estágio um colega me ajudou com um problema parecido com esse usando expressão lambda, só que agora num lembro como foi. Só segunda-feira mesmo pra ver o código.



é eu imaginei que com Expressão Lambda daria certo, até porque eu consigo retornar qual radiobutton esta checado em um formulário, e partindo do principio que um formulário nada mais é doque um classe tentei e não consegui, AINDA....

KERPLUNK 09/12/2011 17:27:04
#391008
O mesmo código em VB.NET:
Imports System.Linq
Imports System.Reflection

Namespace ConsoleApplication1
NotInheritable Class Program
Private Sub New()
End Sub

Public Shared Sub Main()
Dim t = New Teste() With { _
Key .Prop4 = [Ô]Tenho valor[Ô] _
}

Dim [property] = (From prop In GetType(Teste).GetProperties(BindingFlags.Instance Or BindingFlags.[Public]) Where prop.GetValue(t, Nothing) IsNot Nothingprop).[Single]()
Console.WriteLine([Ô]{0}: {1}[Ô], [property].Name, [property].GetValue(t, Nothing))
Console.ReadKey()
End Sub

End Class

Class Teste
Public Property Prop1() As String
Get
Return m_Prop1
End Get
Set
m_Prop1 = Value
End Set
End Property
Private m_Prop1 As String
Public Property Prop2() As String
Get
Return m_Prop2
End Get
Set
m_Prop2 = Value
End Set
End Property
Private m_Prop2 As String
Public Property Prop3() As String
Get
Return m_Prop3
End Get
Set
m_Prop3 = Value
End Set
End Property
Private m_Prop3 As String
Public Property Prop4() As String
Get
Return m_Prop4
End Get
Set
m_Prop4 = Value
End Set
End Property
Private m_Prop4 As String
Public Property Prop5() As String
Get
Return m_Prop5
End Get
Set
m_Prop5 = Value
End Set
End Property
Private m_Prop5 As String
End Class

End Namespace
Página 1 de 2 [13 registro(s)]
Tópico encerrado , respostas não são mais permitidas