REFLECTION / EXPRESSAO LAMBDA QUAL A SOLUCAO IDEAL
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) :
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...
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...
Reflection, pegando todas as variáveis de uma classe:
PropertyInfo[] propriedades = typeof(SUA_CLASSE).GetProperties(BindingFlags.Public | BindingFlags.Static);
PropertyInfo[] propriedades = typeof(SUA_CLASSE).GetProperties(BindingFlags.Public | BindingFlags.Static);
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...
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...
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.
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 ???
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 ???
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.
Porém não consegui fazer funcionar em vb.net.
To tentando aqui, qq coisa eu te chamo.
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.
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....
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
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
Tópico encerrado , respostas não são mais permitidas