Skip to main content

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

#GlobalCode

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# 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 instancia a classe Document, através dele criaremos a instancia quando formos usar a classe Document

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 CreateDocumentInstance(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.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 Global Code entre outras classes do Global Code?

Suponahmos que você tenha uma classe chamada OutraClasseGlobal no Global Code

public class OutraClasseGlobal{

  public string Nome {get;set;}

}

Para instanciar essa classe OutraClasseGlobal dentro do pŕoprio Global Code você tem as opções abaixo:

CreateInstance<T>()
public class MinhaClasseGlobal{

  public void Metodo()[

    var classe2 = CreateInstance<OutraClasseGlobal>();
    
  }

}
GlobalClass.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{

  public void Metodo()[

    var classe2 = GlobalClass.CreateInstanceOutraClasseGlobal();
    
  }

}

Como usar em outras partes do 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 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 Global dinamicamente
        var documentClass01 = GlobalClass.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 Global dinamicamente
        var documentClass02 = GlobalClass.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 Global dinamicamente
        var documentClass01 = GlobalClass.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 Global Code, você não tem acesso ao "Tipo" da classe que você criar.   Então fora do seu class c# de Global Code 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, (se estiver dentro do GlobalCode, você pode referenciar normalmente)
    //referenciar explicitamente o UserClass no foreach
    var userExamples = await GlobalClass.ListUserExamplesAsync();
    foreach(UserClass user in userExamples){
       <text>
           @user.Name
       </text>            
    }
    
    
    
    
    //forma CORRETA se estiver FORA e consumindo o GlobalCode,  (se estiver dentro do GlobalCode, você pode referenciar normalmente)
    //referenciar implicitamente o UserClass no foreach, usando var ou dynamic
    var userExamples = await GlobalClass.ListUserExamplesAsync();
    foreach(var user in userExamples){
       <text>
           @user.Name
       </text>            
    }