Skip to main content

[Custom Page] Como criar uma Classe em C# no Custom Page?

#GlobalCode#CustomPage

IMPORTANTE: a class não pode ser instanciada diretamente, ex: new MyClass() utilize CreateInstanceMyClass() que é gerado automaticamente

IMPORTANTE: a class não pode ter construtor definido

Como definir e instanciar uma classe C# ?

No código C#, coloque o código abaixo, repare que existe metodo fora da classe chamado CreateInstanceDocument que instancia a classe Document, através dele criaremos a instancia quando formos usar a classe Document, mas o Agilityflow também gera um metodo padrão chamado CreateInstanceXXXX sem parametro para gerar a instancia, caso você precise

Importante: para toda classe criada no agilityflow, o sistema gera automaticamente um metodo de criação da instancia dessa classe como  nome CreateInstanceXXXXX onde o XXXX é o nome da classe, se for uma classe chamada Document, ele cria Document CreateInstanceDocument(), porém sempre sem parametros de entrada, no exemplo abaixo, foi gerado manualmente um Document CreateInstanceDocument(string title, string description )

//crie uma classe
public class Document{
    public string Title {get;set;}
    public string Description {get;set;}



    public async Task<List<UserClass>> ListUserExamplesAsync(){
        var userNames = new List<UserClass>();

        var dt = await GlobalContext.CustomPageContext.GetDataTableAsync("select coalesce(usu_nome,'') as name from tbl_usuario where deletado = false limit 5");

        for(var i = 0; i < dt.Rows.Count; i++){

           //repare que pra criar a instancia da classe UserClass, eu utilizo o metodo CreateInstance
            var userClass = CreateInstance<UserClass>();
            userClass.Name = dt.Rows[i]["name"].ToString();
            userNames.Add(userClass);
        }

        return userNames;
    }
}

public class UserClass{
    public string Name {get;set;}
}

//caso queira, crie um metodo para fazer a instancia dessa classe
public Document CreateDocumentInstance(string title, string description ){

    var doc = CreateInstance<Document>();
    doc.Title = title; 
    doc.Description = description;

     return doc;
}

Como instanciar uma classe do GlobalCustom CodePage entre outras classes do GlobalCustom Code?Page?

Suponahmos que você tenha uma classe chamada OutraClasseGlobalOutraClasseNoCustomPage no GlobalCustom CodePage

public class OutraClasseGlobal{OutraClasseNoCustomPage{

  public string Nome {get;set;}

}

Para instanciar essa classe OutraClasseGlobalOutraClasseNoCustomPage dentro do pŕoprio GlobalCustom CodePage você tem as opções abaixo:

CreateInstance<T>()
public class MinhaClasseGlobal{MinhaClasseCustomPage{

  public void Metodo()[

    var classe2 = CreateInstance<OutraClasseGlobalOutraClasseNoCustomPage>();
    
  }

}
GlobalClass.CustomPageClass.CreateInstanceXXXXX()

Importante: para toda classe criada no agilityflow, o sistema gera automaticamente um metodo de criação da instancia dessa classe como  nome CreateInstanceXXXXX onde o XXXX é o nome da classe, se for uma classe chamada Document, ele cria Document CreateInstanceDocument()

public class MinhaClassGlobal{MinhaClassCustomPage{

  public void Metodo()[

    var classe2 = GlobalClass.CreateInstanceOutraClasseGlobal(CustomPageClass.CreateInstanceOutraClasseNoCustomPage();
    
  }

}

Como usar em outras partes do sistema essa classe C# Global?CustomPage?

Por ser uma classe Global,CustomPage, você pode utilizar em qualquer lugar que possa executar C# no sistema, exemplos: Apis, Forms, Reports, Kanban, etc.. 

Para Utilizar, por exemplo dentro de um Cshtml de um form, você tem essas opções:

Opção 01:  Chamando o metodo que o agilityflow gera automaticamente (recomendado):

Importante: para toda classe criada no agilityflow, o sistema gera automaticamente um metodo de criação da instancia dessa classe como  nome CreateInstanceXXXXX onde o XXXX é o nome da classe, se for uma classe chamada Document, ele cria Document CreateInstanceDocument()

@{       
        //instanciando uma class q foi declarada dentro do GlobalCustomPage dinamicamente
        var documentClass01 = GlobalClass.CustomPageClass.CreateInstanceDocument();

        var json = JsonConvert.SerializeObject( new { documentClass01 }); 

}
@json
Opção 02:  Chamando o metodo nativo do agiltyflow para instanciar classes:
@{       
        //instanciando uma class q foi declarada dentro do GlobalCustomPage dinamicamente
        var documentClass02 = GlobalClass.CustomPageClass.CreateInstance("Document"); 

        var json = JsonConvert.SerializeObject( new { documentClass02 }); 

}
@json
Opção 03:  Caso você crie um metodo manualmente que intancie a classe, exemplo o metodo criado no exemplo anterior  CreateDocumentInstance (que você mesmo criou) :
@{       
        //instanciando uma class q foi declarada dentro do GlobalCustomPage dinamicamente
        var documentClass01 = GlobalClass.CustomPageClass.CreateDocumentInstance("string title", "string description");

        var json = JsonConvert.SerializeObject( new { documentClass01 }); 

}
@json

Regras e Limitações:

  • Para toda classe criada no agilityflow, o sistema gera automaticamente um metodo de criação da instancia dessa classe como  nome CreateInstanceXXXXX onde o XXXX é o nome da classe, se for uma classe chamada Document, ele cria Document CreateInstanceDocument(), porém sempre sem parametros de entrada, você pode gerar manualmente um metodo com o mesmo nome mas com outros parametros de entrada, exemplo Document CreateDocumentInstance(string title, string description )
    A classe não deve ter construtor, para instanciar, utilize o metodo CreateInstance<MyClass>()
  • Fora da área do C# do GlobalCustom Code,Page, você não tem acesso ao "Tipo" da classe que você criar.   Então fora do seu class c# de GlobalCustom CodePage você nao vai conseguir usar esse "Tipo",ex:  como ToList<MyClass>() ou por exemplo em uma referencia implicita no foreach,:
  • 
    
    //forma ERRADA se estiver FORA e consumindo o GlobalCode,CustomPage, (se estiver dentro do GlobalCode,CustomPage, você pode referenciar normalmente)
    //referenciar explicitamente o UserClass no foreach
    var userExamples = await GlobalClass.CustomPageClass.ListUserExamplesAsync();
    foreach(UserClass user in userExamples){
       <text>
           @user.Name
       </text>            
    }
    
    
    
    
    //forma CORRETA se estiver FORA e consumindo o GlobalCode,CustomPage,  (se estiver dentro do GlobalCode,CustomPage, você pode referenciar normalmente)
    //referenciar implicitamente o UserClass no foreach, usando var ou dynamic
    var userExamples = await GlobalClass.CustomPageClass.ListUserExamplesAsync();
    foreach(var user in userExamples){
       <text>
           @user.Name
       </text>            
    }