Pregunta

Tengo un problema con los genéricos de .NET.Lo que quiero hacer es guardar una serie de tipos genéricos (GraphicsItem):

public class GraphicsItem<T>
{
    private T _item;

    public void Load(T item)
    {
        _item = item;
    }
}

¿Cómo puedo guardar un tipo genérico tan abierto en una matriz?

¿Fue útil?

Solución

Implemente una interfaz no genérica y utilícela:

public class GraphicsItem<T> : IGraphicsItem
{
    private T _item;

    public void Load(T item)
    {
        _item = item;
    }

    public void SomethingWhichIsNotGeneric(int i)
    {
        // Code goes here...
    }
}

public interface IGraphicsItem
{
    void SomethingWhichIsNotGeneric(int i);
}

Luego use esa interfaz como elemento de la lista:

var values = new List<IGraphicsItem>();

Otros consejos

Si desea almacenar GrpahicsItem heterogéneos, es decir.GraphicsItem< X> y GrpahicsItem< Y> debe derivarlos de una clase base común o implementar una interfaz común.Otra opción es almacenarlos en Lista<objeto>

¿Está intentando crear una matriz de GraphicsItem en un método no genérico?

No puedes hacer lo siguiente:

static void foo()
{
  var _bar = List<GraphicsItem<T>>();
}

y luego llenar la lista más tarde.

¿Lo más probable es que estés intentando hacer algo como esto?

static GraphicsItem<T>[] CreateArrays<T>()
{
    GraphicsItem<T>[] _foo = new GraphicsItem<T>[1];

    // This can't work, because you don't know if T == typeof(string)
    // _foo[0] = (GraphicsItem<T>)new GraphicsItem<string>();

    // You can only create an array of the scoped type parameter T
    _foo[0] = new GraphicsItem<T>();

    List<GraphicsItem<T>> _bar = new List<GraphicsItem<T>>();

    // Again same reason as above
    // _bar.Add(new GraphicsItem<string>());

    // This works
    _bar.Add(new GraphicsItem<T>());

    return _bar.ToArray();
}

Recuerde que necesitará una referencia de tipo genérico para crear una matriz de tipo genérico.Esto puede ser a nivel de método (usando la T después del método) o a nivel de clase (usando la T después de la clase).

Si desea que el método devuelva una matriz de GraphicsItem y GraphicsItem, deje que GraphicsItem herede de una clase base no genérica GraphicsItem y devuelva una matriz de esa.Sin embargo, perderá todo tipo de seguridad.

Espero que ayude.

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