CONVERTER ITEM DE GENERIC LIST OU ACESSAR METODO
Boas,
Criei este seguinte codigo como exemplo:
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á!!
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á!!
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.
Obrigado por postar...
Funcionou....
Também já vi que dá para ter acesso à s propridades sem o uso de reflection...
Seria possivel fazer o cast para cachorro ou gato respectivamente?
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?
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);
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);
}
}
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