none
Reflection RRS feed

  • Pergunta

  • Galera preciso pegar todos os campos que me retornam de um WebService, me indicaram o REflection para fazer isso, porem nunca usei e não entendi nada quando procurei na net.

    Alguem poderia me ajudar ??

    Obrigado

     


    SirSmart
    quinta-feira, 25 de novembro de 2010 13:28

Respostas

  • Ola SirSmart,

       Quando vc diz: "campos que me retornam de um WebService" vc esta se referindo ao fato que vc executou um metodo e quer listar as propriedades da classe de retorno do mesmo ou vc que gerar uma lista de todos os metodos q vc pode acessar deste web service e as propriedades de retorno ?

       De qualquer forma segue um modelo de uso do reflection com webservieces:

    /*
     * Webservice de Teste:
     * http://www.webservicex.net/RealTimeMarketData.asmx?WSDL
     */
    
    using System;
    using System.Linq;
    using System.Web.Services.Protocols;
    
    namespace ConsoleApplication1 {
      class Program {
        [STAThread]
        static void Main(string[] args) {
          using (var service = new Service.RealTimeMarketData()) {
            Console.WriteLine("Descrição do Serviço: {0}", service.Url);
            Console.WriteLine();
            
            // Elimiar metodos herdados:
            var metodosParent = typeof(SoapHttpClientProtocol).GetMethods();
    
            // Pega a lista de metodos publicos do webservice:
            var metodos = service.GetType().GetMethods();
            foreach (var metodo in metodos) {
              if (metodo.Name.EndsWith("Async")) continue;
              if (metodo.Name.StartsWith("add_")) continue;
              if (metodo.Name.StartsWith("remove_")) continue;
              if (metodo.Name.StartsWith("set_")) continue;
              if (metodo.Name.StartsWith("get_")) continue;
              if (metodosParent.Any(mp => mp.Name == metodo.Name)) continue;
    
              Console.WriteLine("- {0}", metodo.Name);          
              if (metodo.ReturnType.Equals(typeof(void))) continue;
    
              // Carrega a lista das propriedade de retorno do metodo 
              var propriedades = metodo.ReturnType.GetProperties();
              foreach (var propriedade in propriedades) {
                Console.WriteLine("\t{0} ({1})", propriedade.Name.PadRight(20), propriedade.PropertyType.Name);
              }
    
              Console.WriteLine();
            }
    
            Console.WriteLine("FIM");
            Console.Read();
          }
        }
      }
    }
    
    

    Resultado:

    Descrição do Serviço: http://www.webservicex.net/RealTimeMarketData.asmx
    
    - TopLists
        DateTime       (String)
        StockLists      (Stock[])
    
    - Book
        Symbol        (String)
        DateTime       (String)
        OrderLists      (Order[])
    
    - LastExecution
        Symbol        (String)
        DateTime       (String)
        OrderLists      (Order[])
    
    - LastExecutionByMilliSecondsAfterMidNight
        Symbol        (String)
        DateTime       (String)
        OrderLists      (Order[])
    
    - LastExecutionByReferenceNumber
        Symbol        (String)
        DateTime       (String)
        OrderLists      (Order[])
    
    - LastExecutionByTime
        Symbol        (String)
        DateTime       (String)
        OrderLists      (Order[])
    
    - StatsSymbol
        Symbol        (String)
        CompanyName     (String)
        Market        (String)
        DateTime       (String)
        LastOrderTime    (String)
        MatchedShares    (Decimal)
        OpenOrders      (Decimal)
        OpenShares      (Decimal)
        BookedShares     (Decimal)
        BookedOrder     (Decimal)
        Price        (Double)
    
    - Quote
        QuoteLists      (Quote[])
    
    FIM

    Eu não sou pago para postar aqui... faço simplesmente porque eu quero....
    • Marcado como Resposta SirSmart sexta-feira, 26 de novembro de 2010 12:54
    quinta-feira, 25 de novembro de 2010 14:05
    Moderador
  • Olá SirSmart, Qual é o Tipo de retorno do seu WebService? Se o seu retorno for uma classe você pode usar o Reflection para buscar e extrair o valor das propriedades do Tipo retornado:


    http://www.alexandreminato.com.br/category/Reflection.aspx

    http://msdn.microsoft.com/pt-br/library/b05d59ty.aspx

    Se a sua necessidade é de sincronização de dados dê uma olhada nesta alternativa, que também permite gerar um banco local (Sql Server CE) a partir de um banco de dados remoto sem uso de Reflection:

    http://www.linhadecodigo.com.br/artigo/2241/Sincronizacao-de-Dados-no-NET-Framework-35.aspx

    Atenciosamente

     


     

    Se o post foi útil marque como resposta. - Advanced Web Application - MCP - Twitter: @mpghelli

    • Marcado como Resposta SirSmart sexta-feira, 26 de novembro de 2010 12:54
    quinta-feira, 25 de novembro de 2010 18:18
  • Ola SirSmart,

        O Exemplo que eu passei acima faz isso... ele lista todos os metodos e todas as propriedades dos tipo de retorno dos mesmos..... usando o reflection.

        Mas no caso de vc retornar um DataTable basta vc listar os ColumnsNames


    Eu não sou pago para postar aqui... faço simplesmente porque eu quero....
    • Marcado como Resposta SirSmart sexta-feira, 26 de novembro de 2010 12:53
    quinta-feira, 25 de novembro de 2010 18:19
    Moderador

Todas as Respostas

  • SirSmar,

    qual exatamente sua necessidade? Poderia explicar o cenário?


    Ricardo Oneda Blog de Ricardo Oneda Perfil de Ricardo Oneda no Twitter Perfil MVP de Ricardo Oneda
    quinta-feira, 25 de novembro de 2010 13:43
    Moderador
  • Ola SirSmart,

       Quando vc diz: "campos que me retornam de um WebService" vc esta se referindo ao fato que vc executou um metodo e quer listar as propriedades da classe de retorno do mesmo ou vc que gerar uma lista de todos os metodos q vc pode acessar deste web service e as propriedades de retorno ?

       De qualquer forma segue um modelo de uso do reflection com webservieces:

    /*
     * Webservice de Teste:
     * http://www.webservicex.net/RealTimeMarketData.asmx?WSDL
     */
    
    using System;
    using System.Linq;
    using System.Web.Services.Protocols;
    
    namespace ConsoleApplication1 {
      class Program {
        [STAThread]
        static void Main(string[] args) {
          using (var service = new Service.RealTimeMarketData()) {
            Console.WriteLine("Descrição do Serviço: {0}", service.Url);
            Console.WriteLine();
            
            // Elimiar metodos herdados:
            var metodosParent = typeof(SoapHttpClientProtocol).GetMethods();
    
            // Pega a lista de metodos publicos do webservice:
            var metodos = service.GetType().GetMethods();
            foreach (var metodo in metodos) {
              if (metodo.Name.EndsWith("Async")) continue;
              if (metodo.Name.StartsWith("add_")) continue;
              if (metodo.Name.StartsWith("remove_")) continue;
              if (metodo.Name.StartsWith("set_")) continue;
              if (metodo.Name.StartsWith("get_")) continue;
              if (metodosParent.Any(mp => mp.Name == metodo.Name)) continue;
    
              Console.WriteLine("- {0}", metodo.Name);          
              if (metodo.ReturnType.Equals(typeof(void))) continue;
    
              // Carrega a lista das propriedade de retorno do metodo 
              var propriedades = metodo.ReturnType.GetProperties();
              foreach (var propriedade in propriedades) {
                Console.WriteLine("\t{0} ({1})", propriedade.Name.PadRight(20), propriedade.PropertyType.Name);
              }
    
              Console.WriteLine();
            }
    
            Console.WriteLine("FIM");
            Console.Read();
          }
        }
      }
    }
    
    

    Resultado:

    Descrição do Serviço: http://www.webservicex.net/RealTimeMarketData.asmx
    
    - TopLists
        DateTime       (String)
        StockLists      (Stock[])
    
    - Book
        Symbol        (String)
        DateTime       (String)
        OrderLists      (Order[])
    
    - LastExecution
        Symbol        (String)
        DateTime       (String)
        OrderLists      (Order[])
    
    - LastExecutionByMilliSecondsAfterMidNight
        Symbol        (String)
        DateTime       (String)
        OrderLists      (Order[])
    
    - LastExecutionByReferenceNumber
        Symbol        (String)
        DateTime       (String)
        OrderLists      (Order[])
    
    - LastExecutionByTime
        Symbol        (String)
        DateTime       (String)
        OrderLists      (Order[])
    
    - StatsSymbol
        Symbol        (String)
        CompanyName     (String)
        Market        (String)
        DateTime       (String)
        LastOrderTime    (String)
        MatchedShares    (Decimal)
        OpenOrders      (Decimal)
        OpenShares      (Decimal)
        BookedShares     (Decimal)
        BookedOrder     (Decimal)
        Price        (Double)
    
    - Quote
        QuoteLists      (Quote[])
    
    FIM

    Eu não sou pago para postar aqui... faço simplesmente porque eu quero....
    • Marcado como Resposta SirSmart sexta-feira, 26 de novembro de 2010 12:54
    quinta-feira, 25 de novembro de 2010 14:05
    Moderador
  • Tenho um método no WebService que me retorna todos os dados que tenho na minha tabela. Porem gostaria de pegar todos os campo dessa tabela em tempo de execução e criar uma tabela no sql na minha maquina local. Pediram para eu usar o reflection, mas não tenho muito o conceito do que ele faz. Ele serve para isso mesmo??

    Só precisaria pegar todos os campos dessa tabela e criar uma nova tabela local...

     

    Como posso fazer??

     

    Obrigado


    SirSmart
    quinta-feira, 25 de novembro de 2010 15:03
  • Olá SirSmart, Qual é o Tipo de retorno do seu WebService? Se o seu retorno for uma classe você pode usar o Reflection para buscar e extrair o valor das propriedades do Tipo retornado:


    http://www.alexandreminato.com.br/category/Reflection.aspx

    http://msdn.microsoft.com/pt-br/library/b05d59ty.aspx

    Se a sua necessidade é de sincronização de dados dê uma olhada nesta alternativa, que também permite gerar um banco local (Sql Server CE) a partir de um banco de dados remoto sem uso de Reflection:

    http://www.linhadecodigo.com.br/artigo/2241/Sincronizacao-de-Dados-no-NET-Framework-35.aspx

    Atenciosamente

     


     

    Se o post foi útil marque como resposta. - Advanced Web Application - MCP - Twitter: @mpghelli

    • Marcado como Resposta SirSmart sexta-feira, 26 de novembro de 2010 12:54
    quinta-feira, 25 de novembro de 2010 18:18
  • Ola SirSmart,

        O Exemplo que eu passei acima faz isso... ele lista todos os metodos e todas as propriedades dos tipo de retorno dos mesmos..... usando o reflection.

        Mas no caso de vc retornar um DataTable basta vc listar os ColumnsNames


    Eu não sou pago para postar aqui... faço simplesmente porque eu quero....
    • Marcado como Resposta SirSmart sexta-feira, 26 de novembro de 2010 12:53
    quinta-feira, 25 de novembro de 2010 18:19
    Moderador