AJUDA COM REFLECTION

FBGSYSTEMS 13/06/2017 17:32:22
#474501
Boa tarde.
Estou começando a implantar meu sistema utilizando Reflection, tendo cmo base os vídeos do Kerplunk.

Porem em alguns metodos no meu projeto não aparecem iguais aos vídeos, sendo exigido outro parametro, como no caso do metodo SetValue()

Eu preciso utilizar assim: SetValue(_return, valor, null); <<<< no exemplo do vídeo este terceiro parametro não existe.


E agora estou com dificuldade para ler os parametros de cada propriedade
DataObjectFieldAttribute att = (DataObjectFieldAttribute)pro.GetCustomAttributes(typeof(DataObjectFieldAttribute), true);   


Ele me obriga a colocar aquele [Ô], true[Ô] como segundo parametro e recebo o seguinte erro:

Cannot convert type [ô]object[][ô] to [ô]System.ComponentModel.DataObjectFieldAttribute

Como resolvo isso ? Utilizo o VS 2010 com framework 4.0
KERPLUNK 13/06/2017 19:03:10
#474503
Resposta escolhida
Você está usando uma versão diferente de framework. Mas não tem problema, muda só a assinatura do método. Vou fazer um exemplo pra você assim que tiver acesso à um computador.
FBGSYSTEMS 14/06/2017 08:52:46
#474510
Bom dia. Obrigado KERPLUNK, fico no aguardo.

Estou tentando achar soluções mas está dificil.
FBGSYSTEMS 14/06/2017 17:54:32
#474520
Fiquei o dia todo e nao consegui resolver o problema. Tentei varias coisas e nao saí desta parte.

Minha ultima tentativa foi a seguinte:

                object  att = pro.GetCustomAttributes (typeof(DataObjectFieldAttribute), true);

DataObjectFieldAttribute att2 = (DataObjectFieldAttribute)att;


Mas ai em tempo de execução da o seguinte erro:

Não é possível converter um objeto do tipo [ô]System.ComponentModel.DataObjectFieldAttribute[][ô] no tipo [ô]System.ComponentModel.DataObjectFieldAttribute[ô].
KERPLUNK 14/06/2017 20:16:04
#474522
Pela mensagem já se pode entender o que está havendo. Na versão de framework que você está usando, DataObjectFieldAttribute é um array(por isso o [Ô][][Ô] no final). Por isso, você deve buscar o ítem desejado nesse array e se quiser, converter para List<T>:

sealed class DataFieldAttribute : Attribute
{
public int Id { get; set; }
public string Valor { get; set; }

}
public class MeuTreco
{

private int myVar;
[DataField(Id = 1, Valor = [Ô]bla bla bla[Ô])]
public int MyProperty
{
get
{

return myVar;
}
set
{
DataFieldAttribute x = (DataFieldAttribute)this.GetType().GetProperties()
.FirstOrDefault(a => a.Name == [Ô]MyProperty[Ô]).GetCustomAttributes(true).First();
//aqui, a variável [Ô]x[Ô] conterá o que quer que esteja no atributo da propriedade [Ô]MyProperty[Ô] e pode ser usado como quiser
Console.WriteLine(x.Valor);
myVar = value;
}
}

}



Fiz com o Framework 4.0.

Uma dica, aprenda a usar a janela de inspeção(Watch Window). Adicione qualquer coisa nela e verá todas as propriedades, métodos e eventos do objeto.
FBGSYSTEMS 16/06/2017 10:37:02
#474559
Bom dia.

Demorei um pouco pra conseguir adaptar(entender) o codigo ao meu projeto mas consegui.

     sealed class DataFieldAttribute : Attribute
{
public bool PrimaryKey { get; set; }
public bool IsIdentify { get; set; }
public bool IsNullable { get; set; }
public int Length { get; set; }

}
=====================
public int _codigo ;
[DataField(PrimaryKey =true, IsIdentify = true, IsNullable = false)]
[Browsable (true)]
[DisplayName ([Ô]Código[Ô])]
public int codigo
{
get { return _codigo; }
set { _codigo = value; }
}

//========================
foreach (PropertyInfo pro in typeof(T).GetProperties().ToList().Where(p => p.GetCustomAttributes (typeof(DataFieldAttribute), true) != null))
{
DataFieldAttribute att = (DataFieldAttribute)this.GetType().GetProperties()
.FirstOrDefault(a => a.Name == pro.Name).GetCustomAttributes(true).First();


if (att.PrimaryKey == false)
{
campos += pro.Name + [Ô],[Ô];

valores += [Ô]@[Ô] + pro.Name + [Ô],[Ô];

_return.Parameters.AddWithValue([Ô]@[Ô] + pro.Name, pro.GetValue(this, null));
}
}




Aparentemente está tudo certo. Vamos continuar a implementação pra ver onde chega.
FBGSYSTEMS 16/06/2017 10:57:19
#474560
Existe alguma forma de eu parar a execução deste metodo e retornar uma mensagem para o metodo que o esta chamadno ou eu teria que colocar algo antes da chamada dele?

Por exemplo, quero ver se algum campo está faltando ou o length dele esta incorreto.
KERPLUNK 16/06/2017 12:53:27
#474562
Você pode lançar uma exception...
FBGSYSTEMS 16/06/2017 16:10:40
#474567
Sim, mas dentro do BackWork e do metodo GetInsertCommand?

Tentei fazer de várias formas mas não deu certo.
A mais lógica e eficiente que pensei foi assim(para inicio0:

                if (att1.PrimaryKey== false &&  att1.IsNullable == false && (pro.GetValue(this, null) == null || pro.GetValue(this, null) == [Ô][Ô]))
{
if (_return == [Ô][Ô])
{
_return = [Ô]Preencha o(s) campo(s) abaixo
[Ô];

DisplayNameAttribute att2 = (DisplayNameAttribute)this.GetType().GetProperties()
.FirstOrDefault(a => a.Name == pro.Name).GetCustomAttributes(typeof(DisplayNameAttribute), true).First();
_return += att2.DisplayName + [Ô]
[Ô]; >>>>>>>> aqui era para parar a execução, mas nao consegui entao fiz um metodo que sempre será chamado antes do GetInsert, e se ele retornar vazio quer dizer que posso chamar o Insert, mas nao queria fazer dois metodos pois tneho medo de lentidão em caso de tabela com muitos campos.

}
}
Tópico encerrado , respostas não são mais permitidas