ORIENTACAO A OBJETOS - CONCEITO

KERPLUNK 12/09/2013 17:48:26
#428780
Citação:

:
Caro KERPLUNK,

Agora me surgiu uma dúvida em relação aquele exemplo que você postou. Nele você informa os atributos para as propriedades e utiliza o reflection para recuperar os nomes de campos e valores, minha dúvida é: E quando a propriedade for outra classe (entidade) como fazer?

Por exemplo, tenho uma classe Pedido e nela a propriedade Cliente não é do tipo inteiro e sim uma classe Cliente. Como fazer para que a classe extendida capture a propriedade Código de cliente e monta o comando SQL corretamente?

[Table(TableName=[Ô]pedidos[Ô])]
class Pedido
{
[Field(TableFieldName=[Ô]numero[Ô], DatabaseType=SqlDbType.Int)]
public int Numero { get; set; }

[Field(TableFieldName=[Ô]id_cliente[Ô], DatabaseType=SqlDbType.Int)]
public Cliente Cliente { get; set; }

....
}


Espero que tenha entendido a minha dúvida. E obrigado pela ajuda.



Quando é esse o caso, essa propriedade tem uma decoração que seria uma outra classe. A decoração [Ô]Field[][Ô], se refere à um campo mesmo, referente à tabela. Quando a propriedade for uma outra entidade, crie uma outra decoração, da maneira que quiser, seguindo o mesmo exemplo de [Ô]Field[][Ô], mas com outro nome, por exemplo [Ô]Related[][Ô]. Construa essa classe [Ô]Related[][Ô] da mesma maneira que a [Ô]Field[][Ô], herdando de Attribute. Nos procedimentos de gravação ou qualquer outro que trabalhe com reflection, buscando os CustomAttributes, verifique o tipo do CustomAttribute. Para tipos [Ô]Field[][Ô] faça a gravação ou o que quer que seja normalmente. Se for do tipo [Ô]Related[][Ô], use recursão para fazer usar a instância do campo e fazer a ação desejada. Não sei se me fiz entender, qualquer dúvida, estamos ae....
FOXMAN 15/09/2013 12:03:27
#428863
Amigos, é o seguinte :

Tomando como exemplo de classe um objeto do tipo VEÍCULO tenho algumas dúvidas e gostaria de um help.

Objeto Veiculo
Propriedades do Objeto:
[PASSAGEIRO, MODELO, TRAÇÃO,MOTOR,MARCHA,List<COR>]

Métodos do Objeto:
[LigaMotor(),EngataPrimeira(),EngataSegunda(),EngataRe(),DesligaMotor()]

Sistematicamente falando teriamos :

Veiculo v = new Veiculo();
v.PASSAGEIRO = [ô]5[ô];
v.MODELO = [Ô]SEDAN[Ô];
v.TRAÇÃO = [Ô]Dianteira[Ô];
v.MOTOR = [Ô]2.0[Ô];
v.MARCHA = [Ô]6[Ô];

COR cor = new COR();
cor = [Ô]BRANCO[Ô];
v.COR.add(cor);


COR cor = new COR();
cor = [Ô]PRETO[Ô];
v.COR.add(cor);

Até aqui tudo OK, eu até poderia definir que COR seria um ENUM para facilitar minha vida, porém não é o que o corre neste meu exemplo.

Agora necessito retornar apenas algumas propreidades dessa classe, como por exemplo :
[PASSAGEIRO, MODELO, TRAÇÃO,MOTOR,MARCHA]

Se eu instanciar a classe irá me retornar todas as propriedades incluindo algumas que nesse momento não desejo.
Utilizando-se de Reflection todas as propriedades me serão retornadas. Pensei em criar atributos para definir quais campos por exemplo serão obrigados a serem retornados pela classe.

Pensei algo assim :

private string _campoxxxxx;
[REQUERIDO(true)]
public string campoxxxxx { get; set; }

Sem sucesso.

Existe alguma forma de fazer este tipo de definição para uma propriedade de classe ????
Ou ainda. Existe como utilizar/setar a propriedade Attributes que automaticamente é gerada na propriedade conforme a imagem abaixo :


FOXMAN 15/09/2013 12:48:36
#428866
Acho que fui muito meticuloso ao explanar minha dúvida...vou resumi-la....

Preciso retornar apenas as propriedades OBRIGATÓRIAS de uma classe. Ou seja , ao fazer uma instância da classe , e através do reflection saber quais propriedades são OBRIGATÓRIAS.

BLLVeiculo Veiculo = new BLLVeiculo();
foreach (PropertyInfo p in Veiculo.GetType().GetProperties())
{
{
if(SE p é OBRIGATORIO)
{
//faço alguma coisa;
};
}
}

KERPLUNK 15/09/2013 20:15:28
#428875
FOXMAN,

Você pode usar uma decoração de propriedade, que nada mais é que uma classe que herde da classe Attribute:

public class Campo : Attribute
{
public bool Obrigatorio {get;set;}
}


Então na sua classe faça:

public class Carro
{
[Campo(Obrigatorio=true)]
public int x {get; set;}
[Campo(Obrigatorio=false)]
public int y {get;set;}
}



Ao percorrer as propriedades, use o método GetCustomAttribute para buscar o atributo obrigatório:

Carro car = new Carro();
foreach (PropertyInfo item in car.GetType().GetProperties())
{
Campo cmp = (Campo)item.GetCustomAttributes(true).FirstOrDefault(x => x.GetType() == typeof(Campo));
if (cmp.Obrigatorio == true)
Console.WriteLine(string.Format([Ô]Propriedade {0} é VERDADEIRA[Ô], item.Name, cmp.Obrigatorio));
else
Console.WriteLine(string.Format([Ô]Propriedade {0} é FALSA[Ô], item.Name, cmp.Obrigatorio));

}
Console.ReadKey();


Veja que o detalhe importante no exemplo. Dentro do foreach, eu pego o atributo do tipo Campo da propriedade, utilizando um simples FirstOrDefault. Esse é o grande barato da coisa, propriedades, podem ter mais de um atributo, na verdade, podem ter vários, um para cada finalidade. Se tiver alguma dúvida, estamos ae
FBGSYSTEMS 16/09/2013 16:40:57
#428911
Galera, fiz outro tópico mas decidir começar a postar aqui. Dei uma lida no tópico e achei muita coisa que pode ser útil, porém para o meu atual conhecimento não consegui entender muita coisa, então acho que o melhor é um passo de cada vez.

Caro KERPLUNK, fiz umas alterações no meu código.
A minha ideia é criar alguns campos em comum para empresas/pessoas (por exemplo, clientes e fornecedores), e ao inserir os clientes, instanciar a classe [Ô]insert_cliente[Ô] que herda as propriedades de [Ô]empresa[Ô].

Por favor veja se agora consegui ficar entre [Ô]Aceitável[Ô] e [Ô]Bom[Ô]. Espero estar no caminho correto agora.

Segue meu código.
    public class databases
{
private string err;
public MySqlConnection conexao;

public string conectaMySql()
{
try
{
// tentando conectar na base de dados
string strCon = [Ô]Server=192.168.0.114;Database=aaaa;Uid=root;Pwd=[ô]xxxxx[ô];Connect Timeout=30;[Ô];
conexao = new MySqlConnection (strCon);
conexao.Open();
}
// aqui retorna o erro
catch (MySqlException erro)
{
this.err = erro.Message;
}

// verifica se a conexao foi aberta com sucesso
if (conexao.State == ConnectionState.Open)
{
return [Ô]Conectou[Ô];
}
else
{
conexao.Close();
return this.err;
}
}

public void desconectaMySql()
{
conexao.Close();
}
}


// inicia classe das propriedades do cliente
public class empresa : databases
{
private string razao;
private string fantasia;
private string cnpj;
private string inscest;
private string telefone;
private string telefone2;
private string celular;
private string email;
private string emailnfe;
private string site;
private string contato;
private string tipo;


public string Razao
{
set { this.razao = value; }
get { return this.razao; }
}

public string Fantasia
{
set { this.fantasia = value; }
get { return this.fantasia; }

}

public string Cnpj
{
set { this.cnpj = value; }
get { return this.cnpj; }
}

public string InscEst
{
set { this.inscest = value; }
get { return this.inscest; }
}

public string Telefone
{
set { this.telefone = value; }
get { return this.telefone; }
}


public string Telefone2
{
set { this.telefone2 = value; }
get { return this.telefone2; }
}


public string Celular
{
set { this.celular = value; }
get { return this.celular; }
}

public string Email
{
set { this.email = value; }
get { return this.email; }
}

public string Emailnfe
{
set { this.emailnfe = value; }
get { return this.emailnfe; }
}

public string Site
{
set { this.site = value; }
get { return this.site; }
}

public string Contato
{
set { this.contato = value; }
get { return this.contato; }
}

public string Tipo
{
set { this.tipo = value; }
get { return this.tipo; }
}


}


// inicia a classe insercao do cliente
public class insert_cliente : empresa
{

private string err;
private string sql;
public string inserir_cliente(string campos,string valores,string tabela)
{


MySqlCommand insert_cliente = new MySqlCommand();


try
{
// MONTANDO A SQL PASSADA PELO FORM
this.sql = [Ô]INSERT INTO cliente (razao, fantasia, cnpj, inscest, telefone, telefone2, celular,email,emailnfe, site, contato, tipo) VALUES ([Ô];
insert_cliente.Connection = conexao;
insert_cliente.CommandText = this.sql;
insert_cliente.ExecuteNonQuery();

return [Ô]Dados inseridos com sucesso![Ô];
}
catch (MySqlException erro)
{
this.err = erro.Message;
return this.err;
}


}

}


Esta mais parecido com OOP agora ?
KERPLUNK 16/09/2013 17:21:51
#428916
FGBSYSTEMS,

Sim, isso se parece bem mais com os conceitos básicos de OOP. Mas ainda insisto em um ponto: não use concatenação de string para fazer o comando SQL, mas sim parametrização.
FBGSYSTEMS 16/09/2013 17:36:28
#428917
KERPLUNK, em qual parte ainda esta com concatenação ?

Pode me dar um exemplo de como seria o certo ?


Fiz umas alterações e estou tendo erro
Error 1 Non-invocable member [ô]MySql.Data.MySqlClient.MySqlCommand.Parameters[ô] cannot be used like a method.

Na seguinte linha:

                this.sql = [Ô]INSERT INTO cliente (razao, fantasia, cnpj, inscest, telefone, telefone2, celular,email,emailnfe, site, contato, tipo,ativo) VALUES ([Ô];
this.sql = this.sql + [Ô]@razao,@fantasia,@cnpj,@inscest,@telefone,@telefone2,@celular,@email,@emailnfe,@site,@contato,@tipo,@ativo)[Ô];

insert_cliente.Parameters.AddWithValue([Ô]?razao[Ô], Razao);


KERPLUNK 16/09/2013 17:50:40
#428921
Dica simples: Atente para os nomes de variáveis...
FBGSYSTEMS 16/09/2013 18:00:58
#428922
Caraca, não estou vendo nada diferente. Se algo estivesse errado, acredito que o AutoComplete nao funcionaria.

O metodo nao pode ser utilizado como um método ?

Edit:
Mudei para
                this.sql = [Ô]INSERT INTO cliente (razao, fantasia, cnpj, inscest, telefone, telefone2, celular,email,emailnfe, site, contato, tipo,ativo) VALUES [Ô];
this.sql = this.sql + [Ô](@razao,@fantasia,@cnpj,@inscest,@telefone,@telefone2,@celular,@email,@emailnfe,@site,@contato,@tipo,@ativo)[Ô];


insert_cliente.CommandText = this.sql;
insert_cliente.Parameters.AddWithValue([Ô]@razao[Ô], Razao);


E o mesmo erro persiste.


Edit 2:
Bem estranho. Enjoei e fechei o projeto e abri novamente. Aí deu certo. Estranho !
FFCOUTO 16/09/2013 19:19:06
#428926
Amigos,

Este conceito de atributos é extremamente útil. A facilidade para implementar o CRUD é monstruoso.

Tenho uma dúvida que ainda persiste, pois uso a versão 2.0 do .NET Framework. No código abaixo:

Field field = (Field)item.GetCustomAttributes(true).FirstOrDefault(x => x.GetType() == typeof(Field));


Como utilizar na versão 2.0? Pois estou fazendo assim:

field= (Field)item.GetCustomAttributes(true)[0];


Kerplunk, o uso da outra classe Relation funcionou perfeitamente. Utilizei 3 parâmetros: TableFieldName, DataType e PropertyName.

Ficando dessa forma:

[Relation(TableFieldName=[Ô]id_cliente[Ô], DatabaseType=SqlDbType.Int, PropertyName=[Ô]Codigo[Ô])]
public Cliente Cliente { get; set; }


FBGSystems,
Amanhã posto aqui a minha implementação de conexão ao banco de dados com uso da classe singleton.

Abraços,

Página 10 de 14 [136 registro(s)]
Faça seu login para responder