Array
(
)

Variáveis Dinâmicas

Alessandro Rosario
   - 26 nov 2012

Bom dia.
Tenho um sistema em camadas onde a camada de dados está em um projeto e a camada de apresentação está em outro projeto. Se eu criar uma variável dinâmica na camada de dados não consigo utilizá-la na camada de apresentação pois dá a seguinte mensagem:
"'object' não contém uma definição para 'nome'". No caso nome é um atributo da minha classe "produto". Se eu colocar o arquivo físico da classe produto na camada de apresentação, então funciona.
Desde já agradeço.

Robson Robsonalves.net
   - 26 nov 2012


Citação:
Bom dia.
Tenho um sistema em camadas onde a camada de dados está em um projeto e a camada de apresentação está em outro projeto. Se eu criar uma variável dinâmica na camada de dados não consigo utilizá-la na camada de apresentação pois dá a seguinte mensagem:
"'object' não contém uma definição para 'nome'". No caso nome é um atributo da minha classe "produto". Se eu colocar o arquivo físico da classe produto na camada de apresentação, então funciona.

Desde já agradeço.


Os dados não aparecem na outra camada?
Eles estão sendo convertido para o tipo Object ?

Já tentou cast?

Alessandro Rosario
   - 26 nov 2012

Aparacem, porém, não consigo acessar os atributos.
Ex:

No projeto da camada de dados se eu criar uma classe "teste" por exemplo, com o seguinte método.

public class Teste
{
public dynamic RecuperarObjAnonimo()
{
List<object> x = new List<object>();
x.Add(new { codigo = 1, nome = "João", idade = 35 });
x.Add(new { codigo = 2, nome = "Pedro", idade = 45 });
x.Add(new { codigo = 3, nome = "Juliano", idade = 25 });
return x;
}
}

No projeto da camada de apresentação eu recupero os dados com:

private void btnBuscar_Click(object sender, RoutedEventArgs e)
{
Teste t = new Teste();
var x = t.RecuperarObjAnonimo();

foreach (dynamic i in x)
{
// Aqui dá a seguinte mensagem "'object' não contém uma definição para 'nome'"
string str = i.nome;
}
}

mas os dados estão na coleção x. Se eu depurar a variável os dados estão lá...

Robson Robsonalves.net
   - 26 nov 2012

Realmente montei um ambiente e deu o erro ....

Impressionante rsrs... Estou vendo se encontro alguma coisa cara..

Robson Robsonalves.net
   - 26 nov 2012

Ele fornece um erro direto do reflection, ou seja, os membros do objeto não existem, apesar de existir :D

Robson Robsonalves.net
   - 26 nov 2012

Cara, tenta implementar essa solução, to sem tempo aqui::

http://stackoverflow.com/questions/2630370/c-sharp-dynamic-cannot-access-properties-from-anonymous-types-declared-in-anot

Alessandro Rosario
   - 26 nov 2012

Robson.

Cara, segui tua dica sobre "ExpandoObject". Consegui fazer o que eu queria, porém, vou estudar outras formas, pois esta não me parece uma boa solução para o meu objetivo. De qualquer forma segue abaixo os resultados caso interesse a outros colegas.

Abraço e muito obrigado.

Na classe de dados:

public List<dynamic> GetValues()
{
List<dynamic> Lista = new List<dynamic>();

dynamic item = new ExpandoObject();
item.codigo = 1;
item.nome = "Pedro";
item.idade = 30;

Lista.Add(item);

item = new ExpandoObject();
item.codigo = 2;
item.nome = "José";
item.idade = 25;

Lista.Add(item);

item = new ExpandoObject();
item.codigo = 3;
item.nome = "Maria";
item.idade = 23;

Lista.Add(item);

return Lista;

}

E na apresentação:

private void button1_Click(object sender, RoutedEventArgs e)
{
teste t = new teste();

var x = t.GetValues();

foreach (ExpandoObject i in x)
{
String teste = ((dynamic)i).nome;
}
}

Robson Robsonalves.net
   - 26 nov 2012

Show de bola, pelo que eu entendi o dynamic é feito em runtime e ele é existente no assembly que o executou no caso o projeto de DAL, quando passamos para outro projeto outro assembly entra na jogada e não encherga mais o dynamic .. acredito que você não irá escapar dessa solução adotada. Até mesmo que essa Classe realiza esse propósito!

Abraços.