Pregunta

Es allí una manera de recoger (por ejemplo,en una Lista) múltiples "genéricos" de los objetos de los que no comparten un super clase?Si es así, ¿cómo puedo acceder a sus propiedades comunes?

Por ejemplo:

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, esta es seudo código, esto no funciona.

También no necesito para acceder a el .Valor de la propiedad (ya que no estaría seguro de tipos).

EDITAR: Ahora que he estado pensando acerca de esto, sería posible el uso de sub-clases para este.Sin embargo, creo que eso significaría que tendría que escribir una nueva subclase para cada nuevo tipo.


@Grzenio Sí, eso exactamente contestado a mi pregunta.Por supuesto, ahora tengo que duplicar la totalidad de la interfaz compartida, pero que no es un gran problema.Yo debería haber pensado en eso...

@aku Tienes razón acerca de la duck typing.Yo no esperaría dos completamente al azar de los tipos de objetos para ser accesible.

Pero pensé objetos genéricos gustaría compartir algún tipo de interfaz común, ya que son exactamente el mismo, aparte de que el tipo en el que están parametrizadas por.Al parecer, este no es el caso, automáticamente.

¿Fue útil?

Solución

Creo que no es posible en C#, porque MyObject no es un baseclass de MyObject.Lo que yo suelo hacer es definir una interfaz (un 'normal', no genérico) y hacer MyObject implementar la interfaz, por ejemplo,

interface INamedObject
{
    string Name {get;}
}

y, a continuación, puede utilizar la interfaz:

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

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

Hizo responder a su pregunta?

Otros consejos

C# no admite pato escritura.Tienes 2 opciones:las interfaces y la herencia, de lo contrario no se puede acceder a propiedades similares de diferentes tipos de objetos.

La mejor manera sería agregar una clase base común, de lo contrario se puede caer de nuevo a la reflexión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top