Skip to main content

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

#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 CreateDocument com 2 parametros 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 CreateDocument(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 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 CreateDocument(string title, string description ){

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

     return doc;
}

Como instanciar uma classe do Custom Page entre outras classes do Custom Page?

Suponahmos que você tenha uma classe chamada OutraClasseNoCustomPage no Custom Page

public class OutraClasseNoCustomPage{

  public string Nome {get;set;}

}

Para instanciar essa classe OutraClasseNoCustomPage dentro do pŕoprio Custom Page você tem as opções abaixo:

CreateInstance<T>()
public class MinhaClasseCustomPage{

  public void Metodo()[

    var classe2 = CreateInstance<OutraClasseNoCustomPage>();
    
  }

}
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 MinhaClassCustomPage{

  public void Metodo()[

    var classe2 = CustomPageClass.CreateInstanceOutraClasseNoCustomPage();
    
  }

}

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

Por ser uma classe 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 CustomPage dinamicamente
        var documentClass01 = 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 CustomPage dinamicamente
        var documentClass02 = 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  CreateDocument (que você mesmo criou) :
@{       
        //instanciando uma class q foi declarada dentro do CustomPage dinamicamente
        var documentClass01 = CustomPageClass.CreateDocument("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 CreateDocument(string title, string description )
    A classe não deve ter construtor, para instanciar, utilize o metodo CreateInstance<MyClass>()
  • Fora da área do C# do Custom Page, você não tem acesso ao "Tipo" da classe que você criar.   Então fora do seu class c# de Custom Page 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 CustomPage, (se estiver dentro do CustomPage, você pode referenciar normalmente)
    //referenciar explicitamente o UserClass no foreach
    var userExamples = await CustomPageClass.ListUserExamplesAsync();
    foreach(UserClass user in userExamples){
       <text>
           @user.Name
       </text>            
    }
    
    
    
    
    //forma CORRETA se estiver FORA e consumindo o CustomPage,  (se estiver dentro do CustomPage, você pode referenciar normalmente)
    //referenciar implicitamente o UserClass no foreach, usando var ou dynamic
    var userExamples = await CustomPageClass.ListUserExamplesAsync();
    foreach(var user in userExamples){
       <text>
           @user.Name
       </text>            
    }