Skip to main content

[Global Code] Como criar uma Classe Global em C#

#GlobalCode

IMPORTANTE: a class só pode ser utilizado com fields, nao pode ter metodos ou properties, ela aqui só será utilizado como uma estrutura de Dados

Ponto de atenção:  A classe no custom code é apenas uma Estrutura de Dados. Não é permitido criar métodos dentro da classe.

Uma classe no agilityflow deve ser utilizada apenas como uma estrutura de dados, se você precisar criar métodos complexos, utilize o método fora da classe e crie a classe apenas como estruturação de como serão/ficarão os sesus dados.

Exemplo de como NÃO deve ser feito:

public class UserClass{

    public string Name;

}


public class UserExample{
  

    public UserExample(){
        
    }

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

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

        for(var i = 0; i < dt.Rows.Count; i++){
            userNames.Add(new UserClass() { Name = dt.Rows[i]["name"].ToString() } );
        }

        return userNames;
    }

}




Exemplo de como deve ser feito: Colocando o metodo complexo pra fora de uma classe.

public class UserClass{

    public string Name;

}


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

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

    for(var i = 0; i < dt.Rows.Count; i++){
        userNames.Add(new UserClass() { Name = dt.Rows[i]["name"].ToString() } );
    }

    return userNames;
}




Como definir e instanciar uma classe C# que está definida no Global Code?

Entre em Global Code na área de configuração, na aba C# GlobalClass e clique em Novo C#.

Crie um C# chamado "Document"

image.png

No código C#, coloque o código abaixo, repare que existe metodo fora da classe chamado CreateDocumentInstance que espelha o Construtor da classe Document, através dele criaremos a instancia quando formos usar a classe Document

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

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

    return new Document(){ Title=title, Description=description };
}

Como usar no sistema essa classe C# Global?

Por ser uma classe Global, 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 2 opções:

Opção 01:  Chamando o metodo CreateDocumentInstance que você mesmo criou (recomendado):

@{       
        //instanciando uma class q foi declarada dentro do Global dinamicamente
        var documentClass01 = GlobalClass.CreateDocumentInstance("string title", "string description");

        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 Global dinamicamente
        var documentClass02 = GlobalClass.CreateInstanceForClass("Document"); 

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

}
@json

Limitações:

  • A classe é apenas uma estrutura de dados
  • A classe deve ter apenas Fields e Constants
  • A classe nao permite, propriedades, metodos construtores etc.
  • Você não tem acesos a "Tipo" da classe, a classe retorna apenas como dynamic, então você nao vai conseguir usar um Cast, como ToList<Class>() ou por exemplo em uma referencia implicita, nao é permitido:
  • 
    //forma ERRADA, referenciar explicitamente o UserClass no foreach
    var userExamples = await GlobalClass.ListUserExamplesAsync();
    foreach(UserClass user in userExamples){
       <text>
           @user.Name
       </text>            
    }
    
    //forma CORRETA, referenciar implicitamente o UserClass no foreach, usando var ou dynamic
    var userExamples = await GlobalClass.ListUserExamplesAsync();
    foreach(var user in userExamples){
       <text>
           @user.Name
       </text>            
    }