AJUDA COM REFLECTION

 Tópico anterior Próximo tópico Novo tópico

AJUDA COM REFLECTION

C#

 Compartilhe  Compartilhe  Compartilhe
#474501 - 13/06/2017 17:32:22

FBGSYSTEMS
MARANHAO
Cadast. em:Abril/2012


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




Resposta escolhida #474503 - 13/06/2017 19:03:10

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
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.

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#474510 - 14/06/2017 08:52:46

FBGSYSTEMS
MARANHAO
Cadast. em:Abril/2012


Última edição em 14/06/2017 10:50:34 por FBGSYSTEMS

Bom dia. Obrigado KERPLUNK, fico no aguardo.

Estou tentando achar soluções mas está dificil.




#474520 - 14/06/2017 17:54:32

FBGSYSTEMS
MARANHAO
Cadast. em:Abril/2012


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'.




#474522 - 14/06/2017 20:16:04

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
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.

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#474559 - 16/06/2017 10:37:02

FBGSYSTEMS
MARANHAO
Cadast. em:Abril/2012


Última edição em 16/06/2017 10:50:18 por FBGSYSTEMS

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.




#474560 - 16/06/2017 10:57:19

FBGSYSTEMS
MARANHAO
Cadast. em:Abril/2012


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.



#474562 - 16/06/2017 12:53:27

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Você pode lançar uma exception...

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#474567 - 16/06/2017 16:10:40

FBGSYSTEMS
MARANHAO
Cadast. em:Abril/2012


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 \n";
                        
                        DisplayNameAttribute att2 = (DisplayNameAttribute)this.GetType().GetProperties()
                        .FirstOrDefault(a => a.Name == pro.Name).GetCustomAttributes(typeof(DisplayNameAttribute), true).First();
                        _return += att2.DisplayName + "\n"; >>>>>>>> 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 anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por FBGSYSTEMS em 23/06/2017 10:19:31