Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Gerson Barreto da Silva Ne

Generics

Recommended Posts

Prezados,

public class Controller<T>
	{

		public Boolean Insert( )
		{
			Academia.DAO.DAO di = new Academia.DAO.DAO();
		
		   Type t = typeof(T);
			PropertyInfo[] list = t.GetProperties();

			foreach (PropertyInfo p in list)
			{
				Object[] attributes = p.GetCustomAttributes(typeof(T), true);

				foreach (object attribute in attributes)
				{
					T a = (T)attribute;
					
				}
			}
Acontece que não estou conseguindo carregar a variável attributes do tipo Object[]. O p.GetCustomAttributes(typeof(T), true) está retornando as propriedades da classe T corretamente. O que estou fazendo de errado alguêm pode ajudar?

 

Grato,

Gerson Barreto Neto

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi o que você está tentando fazer. O que você precisa?

A classe <T> é de que tipo geralmente? Uma entidade?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi o que você está tentando fazer. O que você precisa?

A classe <T> é de que tipo geralmente? Uma entidade?

Boa tarde cidadão,

 

A definação dessa classe é genérica.

Segue a chamada da classe;

 

Academia.Model.Modalidade m = new Academia.Model.Modalidade(1, "TESTE");

 

 

Academia.Controller.Controller<Academia.Model.Modalidade> cm = new Controller<Academia.Model.Modalidade>();

cm.Insert();

 

Estou querendo recuperar as propriedades da classe para axecutar o comando abaixo;

 

string cmd = "Insert Into T(Codigo, Descricao) Values (" + Codigo + ",' " + Descricao + "')";

 

return di.QueryCUD(cmd);

 

Ok ?

 

Grato,

Gerson Barreto Neto

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como você definiu a classe Modalidade?

Você está usando atributos que indicam quais as colunas no banco de dados?

Para pegar o nome da propriedade você pode usar o p.Name.

 

Outra coisa, seu método não deveria se assim:

public Boolean Insert(T entidade)
??

 

Pois você vai precisar pegar os valores também.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como você definiu a classe Modalidade?

Você está usando atributos que indicam quais as colunas no banco de dados?

Para pegar o nome da propriedade você pode usar o p.Name.

 

Outra coisa, seu método não deveria se assim:

public Boolean Insert(T entidade)
??

Como já definir a classe genérica abaixo é necessário definir o método também?

Public Class Controller<T>

{

 

}

Pois você vai precisar pegar os valores também.

Definição da classe Modalidade ;

 

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
	public class Modalidade : Attribute
	{
		//Declaração de variáveis
		private int _codigo;
		private string _descricao;

		//Construtor da classe modalidade
		public Modalidade(int codigo, string descricao)
		{
			_codigo	= codigo;
			_descricao = descricao;
		}
		
		//Construtor da classe modalidade vazio
		public Modalidade()
		{ }

		//Propriedades set e get do código
		public int Codigo
		{
			set { _codigo = value; }
			get { return _codigo; }
		}

		//Propriedades set e get da descrição
		public string Descricao
		{
			set { _descricao = value; }
			get { return _descricao; }
		}
	}
}

Objetivo - Criei a classe Controlle para receber uma entidade, recuperar as propriedades e valores desta entidade e passar para classe DAO.

 

sds,

Gerson Barreto Neto

Compartilhar este post


Link para o post
Compartilhar em outros sites

Está tudo meio confuso para mim ainda, achei que modalidade era uma entidade, mas vou tentar ajuda.

 

Se minha propriedade está decorada assim:

[MeuAtributo("MeuClienteNome")]
public string Nome { get; set; }

Para eu pegar o valor "MeuClienteNome" eu faço assim:

Cliente c = new Cliente();
PropertyInfo p = c.GetType().GetProperty("Nome");
object[] atts = p.GetCustomAttributes(typeof(MeuAtributoAttribute), false);
if (atts.Length > 0)
{
	string valor = (atts[0] as MeuAtributoAttribute).Valor;
}

Meu atributo está assim:

[global::System.AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)]
sealed class MeuAtributoAttribute : Attribute
{
	public string Valor;
	// This is a positional argument
	public MeuAtributoAttribute(string valor)
	{
		this.Valor = valor;
	}
}

 

Obs.: Se modalidade é um attribute, mude o nome para ModalidadeAttribute. É um padrão ter este nome.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia Amigos,

 

Vou explicar tudo;

 

1. Criei uma entidade ex: Modalidade com seus respectivos atributos e propriedades.

2. Criei uma classe controller que irar montar meus comandos CRUD (Insert, Update, Select e Delete), sendo essa classe do tipo <T> 'genérica' que irá processar qualquer entidade.

3. Na classe controller os métodos recebem um párametro do tipo T genérico.

 

Dúvidas:

1. Como faz para retornar os atributos do entidade ex: Modalidade, sabendo que o nome da tabela no banco de dados e o nome das colunas são iguais.

2. Como faz para retornar os valores dos atributos do entidade ex: Modalidade.

3. Como faço para identificar se um determinado atributo é chave primária.

 

Segue abaixo como resolvi as duas primeiras dúvidas, com a ajuda de vocês;

 

public Boolean Insert(T entidade)
		{
			Type t = entidade.GetType();
			PropertyInfo[] p = t.GetProperties();

			for (int i = 0; i < p.Length; i++)
			{
				if (i == 0)
				{
					_columnTable = p[i].Name;
					_columnValue = p[i].GetValue(entidade, null);
				}
				else
				{
					_columnTable = _columnTable + ", " + p[i].Name;
					_columnValue = _columnValue + ", " + p[i].GetValue(entidade, null);
				}
			}

			_cmd = "Insert Into" + " " + t.Name + " (" + _columnTable + ") Values ( " + _columnValue + ")";

			return dao.QueryCUD(_cmd);

Grato,

Gerson Barreto Neto

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode fazer o sql assim:

string sql = "SELECT * FROM " + typeof(T).Name;

Para criar a classe você pode fazer assim:

 

T entity = Activator.CreateInstance<T>();
string sql = string.Format("SELECT * FROM {1}", typeof(T).Name);
using (IDataReader dr = this.Database.ExecuteReader(sql))
{
	if (dr.Read())
	{
		foreach (PropertyInfo p in entity.GetType().GetProperties())
		{
			string columnName = p.Name;
			object value = dr.GetValue(dr.GetOrdinal(columnName));
			p.SetValue(entity, (value == DBNull.Value) ? null : value, null);
		}
	}
}

Poste os resultados :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.