ORIENTACAO A OBJETOS - CONCEITO
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....
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 :
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 :
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.
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;
};
}
}
FOXMAN,
Você pode usar uma decoração de propriedade, que nada mais é que uma classe que herde da classe Attribute:
Então na sua classe faça:
Ao percorrer as propriedades, use o método GetCustomAttribute para buscar o atributo obrigatório:
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
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
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.
Esta mais parecido com OOP agora ?
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 ?
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.
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.
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:
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);
Dica simples: Atente para os nomes de variáveis...
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
E o mesmo erro persiste.
Edit 2:
Bem estranho. Enjoei e fechei o projeto e abri novamente. AÃ deu certo. Estranho !
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 !
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:
Como utilizar na versão 2.0? Pois estou fazendo assim:
Kerplunk, o uso da outra classe Relation funcionou perfeitamente. Utilizei 3 parâmetros: TableFieldName, DataType e PropertyName.
Ficando dessa forma:
FBGSystems,
Amanhã posto aqui a minha implementação de conexão ao banco de dados com uso da classe singleton.
Abraços,
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,
Faça seu login para responder