none
WF : C# : Instanciar Classe RRS feed

  • Pergunta

  • Olá Desenvolvedores, boa tarde!

    Exemplo  Tenho 3 ou mais classes :

    - Cli001ABC()

    - Cli001DEF()

    - Cli016XTP()


    Há como instanciar/chamar uma classe, chamando-a desta maneira ?

    Exemplo :

    string vCodCli="001";

    string vProcedimento = "DEF"

    string vnomeClasse = vcodCli+vProcedimento+"()"

    bool vRetorno = vnomeClasse

    Em xHarbour, eu poderia utilizar uma Macro :

    vRetorno = &vnomeClasse

    Tem algo parecido ?

     


    Gilberto Herminio Desenvolvedor - Mogi das Cruzes-SP desenvolvedor.gha@gmail.com

    terça-feira, 21 de fevereiro de 2017 16:32

Respostas

  • Falha minha:

    o parametro nao é passado no GetMethod, mas sim no Invoke. Codigo corrigido abaixo:

    void Processar()
    {
    	string vNomeClasse = "TOI_SisAdmin.CriarLayoutDados";
    	string vProcedimento = "DB_000104_C21M01";
    	Type type = Type.GetType(vNomeClasse);
    	object instance = Activator.CreateInstance(type);
    	MethodInfo Procedimento = type.GetMethod(vProcedimento);
    	object vRetorno = Procedimento.Invoke(instance, new object[]{"arquivo.txt"});        //chama o metodo definido em vProcedimento e passa o parametro
                
    }

    att



    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------



    terça-feira, 21 de fevereiro de 2017 19:04
    Moderador

Todas as Respostas

  • Sim... Usando Reflection.

    Veja esse tutorial:

    https://johnlnelson.com/2014/06/17/system-reflection-generic-methods/

    Basicamente o que voce tem a fazer é isso:

    using System;
    using System.Reflection;
    
    public class Cli001ABC
    {
        public bool Procedimento() { return true; }
    }
    
    public class Cli001DEF
    {
        public bool Procedimento(){ return true; }
    }
    
    
    
    public class Program
    {
        static void Main()
        {
    	string vCodCli="001";
    	string vProcedimento = "DEF"
    	string vnomeClasse = "Cli"+vcodCli+vProcedimento;
    		
            string name = vnomeClasse;
            string method = "Procedimento";
            
            // Get the type contained in the name string
            Type type = Type.GetType(name, true);
    
            // create an instance of that type
            object instance = Activator.CreateInstance(type);
    
            MethodInfo Procedimento = type.GetMethod(method);
    	object vRetorno = Procedimento.Invoke(instance, null);
    
            console.WriteLine(vnomeClasse +"."+ method +" retornou: {0}", vRetorno);
            
        }
    }
    fonte:https://msdn.microsoft.com/pt-br/library/a89hcwhh(v=vs.110).aspx?f=255&MSPPError=-2147217396&cs-save-lang=1&cs-lang=csharp#code-snippet-2

    att



    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------



    terça-feira, 21 de fevereiro de 2017 17:11
    Moderador
  • Olá William, Excelente Tarde

    Obrigado por seu retorno :

    Dentro de um Form, após selecionar uns itens, eu chamo o Processar(), veja :

     void Processar()
            {
                string vNomeClasse = "CriarLayoutDados";
    
                string vProcedimento = "DB_000104_C21M01";
                
                Type type = Type.GetType(vNomeClasse, true);
    
                object instance = Activator.CreateInstance(type);
    
                MethodInfo Procedimento = type.GetMethod(vProcedimento);
    
                object vRetorno = Procedimento.Invoke(instance, null);        
                
            }

    Dái, a classe "CriarLayoutDados" está fora deste Form principal. ok. Eu ADD no projeto principal :

    using System.Windows.Forms;
    
    namespace TOI_SisAdmin
    {
        public class CriarLayoutDados
        {
            
            public bool DB_000104_C21M01(string vNomeArq)
            {
                MessageBox.Show("estou aquio.", "OLÁ");
                return true;
            }
            
        }
    }
    

    Só que já um erro de "cara" quando ainda estou o void Processar(), nesta linha : .

      Type type = Type.GetType(vNomeClasse, true);

    Additional information: Não foi possível carregar o tipo CriarLayoutDados do assembly TOI_SisAdmin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.


    Gilberto Herminio Desenvolvedor - Mogi das Cruzes-SP desenvolvedor.gha@gmail.com

    terça-feira, 21 de fevereiro de 2017 18:00
  • Troquei a linha :

    string vNomeClasse = "CriarLayoutDados";

    Para :

     string vNomeClasse = "TOI_SisAdmin.CriarLayoutDados";

    Passou.......


    Gilberto Herminio Desenvolvedor - Mogi das Cruzes-SP desenvolvedor.gha@gmail.com

    terça-feira, 21 de fevereiro de 2017 18:38
  • William, SIM! está no mesmo projeto!!


    Gilberto Herminio Desenvolvedor - Mogi das Cruzes-SP desenvolvedor.gha@gmail.com


    • Editado Gilberto_Mogi terça-feira, 21 de fevereiro de 2017 19:01 correção!
    terça-feira, 21 de fevereiro de 2017 18:56
  • Falha minha:

    o parametro nao é passado no GetMethod, mas sim no Invoke. Codigo corrigido abaixo:

    void Processar()
    {
    	string vNomeClasse = "TOI_SisAdmin.CriarLayoutDados";
    	string vProcedimento = "DB_000104_C21M01";
    	Type type = Type.GetType(vNomeClasse);
    	object instance = Activator.CreateInstance(type);
    	MethodInfo Procedimento = type.GetMethod(vProcedimento);
    	object vRetorno = Procedimento.Invoke(instance, new object[]{"arquivo.txt"});        //chama o metodo definido em vProcedimento e passa o parametro
                
    }

    att



    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------



    terça-feira, 21 de fevereiro de 2017 19:04
    Moderador
  • William, 

    Muito Obrigado mesmo!!

    Funcionou...

    Grato e Ainda +Sucesso!


    Gilberto Herminio Desenvolvedor - Mogi das Cruzes-SP desenvolvedor.gha@gmail.com

    terça-feira, 21 de fevereiro de 2017 19:10