CONVERTER ITEM DE GENERIC LIST OU ACESSAR METODO

GANDA.NICK 19/05/2016 14:46:09
#462274
Boas,

Criei este seguinte codigo como exemplo:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var c1 = new Cachorro([Ô]bob[Ô], 15);
var c2 = new Cachorro([Ô]pluto[Ô], 17);

var cachorros = new List<Cachorro>();
cachorros.Add(c1);
cachorros.Add(c2);

FazBarulho(cachorros);
Console.WriteLine([Ô]==========================[Ô]);

var g1 = new Gato([Ô]tareco[Ô], 7);
var g2 = new Gato([Ô]kitie[Ô], 8);
var gatos = new List<Gato>();
gatos.Add(g1);
gatos.Add(g2);

FazBarulho(gatos);

Console.ReadKey();
}

static void FazBarulho<T>(List<T> lista)
{
foreach (var item in lista)
{
//Como coverter o item para o tipo Cachorro ou Gato ???

Type type = item.GetType();
Console.WriteLine(type.ToString());

object metodo = item.GetType().GetMethod([Ô]FazerBarulho[Ô]);
// Como usar o metodo ???

PropertyInfo propertyInfo = item.GetType().GetProperty([Ô]Nome[Ô]);
object nome = propertyInfo.GetValue(item, null);

Console.WriteLine(nome.ToString());
}
}
}

abstract class Animal
{
public int Peso { get; set; }
public String Nome { get; set; }

public abstract void FazerBarulho();
}

class Gato : Animal
{
public Gato(string nome, int peso)
{
this.Nome = nome;
this.Peso = peso;
}
public override void FazerBarulho()
{
Console.WriteLine([Ô]MIAU MIAU[Ô]);
}
}

class Cachorro : Animal
{
public Cachorro(string nome, int peso)
{
this.Nome = nome;
this.Peso = peso;
}
public override void FazerBarulho()
{
Console.WriteLine([Ô]AO AO[Ô]);
}
}
}


Dentro do metodo static void FazBarulho estou a percorrer uma lista<T> que pode conter objectos do tipo Cachorro ou Gato.....
Como posso acessar aos metodos dentro dessas classes? (Cachorro / Gato)

Como o uso de reflection consigo acessar às propriedades... mas não aos metodos...

Seria possivel converter o item da lista denovo para Cachorro ou Gato????

Qual o melhor jeito? e as opções que tenho?

Obrigado desde já!!
JABA 19/05/2016 15:09:54
#462277
Para executar o método é só fazer assim:

object metodo = item.GetType().GetMethod([Ô]FazerBarulho[Ô]).Invoke(item, null); //como não existem parâmetros, passe um null.
GANDA.NICK 19/05/2016 15:35:09
#462278
Obrigado por postar...

Funcionou....

Também já vi que dá para ter acesso às propridades sem o uso de reflection...
object nome = item.GetType().GetProperty([Ô]Nome[Ô]).GetValue(item, null);



Seria possivel fazer o cast para cachorro ou gato respectivamente?
JABA 19/05/2016 15:57:45
#462280
Resposta escolhida
Citação:

Seria possivel fazer o cast para cachorro ou gato respectivamente?



O problema é que Cachorro não é gato. O certo, ao meu ver, é converter para a classe Animal. Se quiser fazer uma junção dos dois, terá que usar Interface. O que você tá querendo fazer é parecido com o que a linguagem Ruby faz; ou seja, basta que os comportamentos sejam os mesmos para utiliza-los no objeto que bem entender. Dessa forma, cachorro poderia ser gato e gato ser cachorro, sem fazer uso de herança multipla.

object metodo = item.GetType().GetMethod([Ô]FazerBarulho[Ô]).Invoke([txt-color=#e80000]item as Animal[/txt-color], null);

OCELOT 19/05/2016 16:37:20
#462283
Por mais genérico que seu método seja ele precisa saber com o que ele está trabalhando, por mais que usar Reflection pode ser uma solução o ideal é especificar melhor com o que está trabalhando, no seu caso você sempre vai ter algum objeto que herda de Animal, então você pode adicionar uma Constraint no método genérico e fazer da seguinte forma
static void FazBarulho<T>(List<T> lista) where T : Animal
{
foreach (var item in lista)
{
item.FazerBarulho();
Console.WriteLine(item.Nome);
}
}
KERPLUNK 19/05/2016 17:54:35
#462289
Citação:

:
Obrigado por postar...

Funcionou....

Também já vi que dá para ter acesso às propridades sem o uso de reflection...

object nome = item.GetType().GetProperty([Ô]Nome[Ô]).GetValue(item, null);



Seria possivel fazer o cast para cachorro ou gato respectivamente?


Isso já é usar Reflection.

E concordo com os colegas acima. Generalizar é bacana, mas não para tudo. O ideal seria mesmo usar uma interface. E sinceramente meus parabéns por investir um tempo em estudar esse tipo de coisa. Com certeza vai ser de grande valia no futuro quando precisar criar algo mais complexo.
Tópico encerrado , respostas não são mais permitidas