Pergunta

Existe uma maneira de coletar (por ex.em uma lista) vários objetos 'genéricos' que não compartilham uma superclasse comum?Em caso afirmativo, como posso acessar suas propriedades comuns?

Por exemplo:

class MyObject<T>
{
   public T Value { get; set; }
   public string Name { get; set; }

   public MyObject(string name, T value)
   {
      Name = name;
      Value = value;
   }
}

var fst = new MyObject<int>("fst", 42);
var snd = new MyObject<bool>("snd", true);

List<MyObject<?>> list = new List<MyObject<?>>(){fst, snd};

foreach (MyObject<?> o in list)
   Console.WriteLine(o.Name);

Obviamente, isso é pseudocódigo, não funciona.

Além disso, não preciso acessar a propriedade .Value (já que isso não seria seguro para o tipo).

EDITAR: Agora que estou pensando sobre isso, seria possível usar subclasses para isso.No entanto, acho que isso significaria que teria que escrever uma nova subclasse para cada novo tipo.


@GrzenioSim, isso respondeu exatamente à minha pergunta.Claro, agora preciso duplicar toda a interface compartilhada, mas isso não é um grande problema.Eu deveria ter pensado nisso...

@akuVocê está certo sobre a digitação do pato.Eu não esperaria que dois tipos de objetos completamente aleatórios estivessem acessíveis.

Mas pensei que objetos genéricos compartilhariam algum tipo de interface comum, já que são exatamente iguais, exceto pelo tipo pelo qual são parametrizados.Aparentemente, este não é o caso automaticamente.

Foi útil?

Solução

Não acho que seja possível em C#, porque MyObject não é uma classe base de MyObject.O que normalmente faço é definir uma interface (uma interface 'normal', não genérica) e fazer com que MyObject implemente essa interface, por exemplo.

interface INamedObject
{
    string Name {get;}
}

e então você pode usar a interface:

List<INamedObject> list = new List<INamedObject>(){fst, snd};

foreach (INamedObject o in list)
   Console.WriteLine(o.Name);

Respondeu à sua pergunta?

Outras dicas

C# não suporta digitação de pato.Você tem 2 opções:interfaces e herança, caso contrário você não poderá acessar propriedades semelhantes de diferentes tipos de objetos.

A melhor maneira seria adicionar uma classe base comum, caso contrário você poderá voltar à reflexão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top