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

\#GlobalCode

<p class="callout danger">IMPORTANTE: a class não pode ser instanciada diretamente, <s>ex: new MyClass()</s> utilize CreateInstanceMyClass() que é gerado automaticamente</p>

<p class="callout danger">IMPORTANTE: a class não pode ter construtor definido</p>


### 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](https://wiki.agilityflow.io/uploads/images/gallery/2025-02/scaled-1680-/RjTimage.png)](https://wiki.agilityflow.io/uploads/images/gallery/2025-02/RjTimage.png)

No código C#, copie e cole o código abaixo, repare que foi criado manualmente o 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 **<span style="text-decoration: underline;">CreateInstanceDocument</span>** sem parametro para gerar a instancia, caso você precise.

<p class="callout info"><span style="text-decoration: underline;">Importante</span>: para toda classe criada no agilityflow, o sistema gera automaticamente um metodo de criação da instancia dessa classe com o nome CreateInstanceXXXXX onde o XXXX é o nome da classe, se for uma classe chamada Document, ele cria **Document CreateInstanceDocument()**, sempre sem parametros de entrada</p>

```c#
//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 CreateDocument(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

```c#
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:

##### <u>CreateInstance&lt;T&gt;()</u>

```c#
public class MinhaClasseGlobal{

  public void Metodo()[

    var classe2 = CreateInstance<OutraClasseGlobal>();
    
  }

}
```

### **Como usar em outras partes do sistema essa classe C# Global (em outros contextos) ?**

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:

##### <span style="text-decoration: underline;">**Opção 01:**</span> Chamando o metodo que o agilityflow gera automaticamente <span style="color: rgb(0, 0, 0); background-color: rgb(53, 152, 219);">**(recomendado)**</span>:

<p class="callout info"><span style="text-decoration: underline;">Importante</span>: para toda classe criada no agilityflow, o sistema gera automaticamente um metodo de criação da instancia dessa classe com o nome CreateInstanceXXXXX onde o XXXX é o nome da classe, se for uma classe chamada Document, ele cria **Document CreateInstanceDocument()**</p>

```c#
@{       
        //instanciando uma class q foi declarada dentro do Global dinamicamente
        var documentClass01 = GlobalClass.CreateInstanceDocument();

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

}
@json

```

##### <span style="text-decoration: underline;">**Opção 02:**</span> Chamando o metodo nativo do agiltyflow para instanciar classes:

```c#
@{       
        //instanciando uma class q foi declarada dentro do Global dinamicamente
        var documentClass02 = GlobalClass.CreateInstance("Document"); 

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

}
@json

```

##### <span style="text-decoration: underline;">**Opção 03:**</span> Caso você crie um metodo manualmente que intancie a classe**,** exemplo o metodo criado no exemplo anterior  **CreateDocument (**que você mesmo criou) :

```c#
@{       
        //instanciando uma class q foi declarada dentro do Global dinamicamente
        var documentClass01 = GlobalClass.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&lt;MyClass&gt;()**
- 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<span style="color: rgb(224, 62, 45);"> **ToList&lt;MyClass&gt;()** </span>ou por exemplo em uma referencia implicita no foreach,:
- ```c#
    
    
    //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>            
    }
    ```