Pergunta

Estou enfrentando um problema com genéricos do .NET.O que quero fazer é salvar uma série de tipos genéricos (GraphicsItem):

public class GraphicsItem<T>
{
    private T _item;

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

Como posso salvar esse tipo genérico aberto em uma matriz?

Foi útil?

Solução

Implemente uma interface não genérica e use-a:

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);
}

Em seguida, use essa interface como item da lista:

var values = new List<IGraphicsItem>();

Outras dicas

Se você deseja armazenar GrpahicsItem heterogêneos, ou seja,GraphicsItem< X> e GrpahicsItem< Y> você precisa derivá-los da classe base comum ou implementar uma interface comum.Outra opção é armazená-los em List< object>

Você está tentando criar um array de GraphicsItem em um método não genérico?

Você não pode fazer o seguinte:

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

e preencha a lista mais tarde.

É mais provável que você esteja tentando fazer algo assim?

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();
}

Lembre-se de que você precisará de uma referência de tipo genérico para criar um array de tipo genérico.Isso pode ser no nível do método (usando o T após o método) ou no nível da classe (usando o T após a classe).

Se você deseja que o método retorne uma matriz de GraphicsItem e GraphicsItem, deixe GraphicsItem herdar de uma classe base não genérica GraphicsItem e retornar uma matriz disso.Você perderá toda a segurança do tipo.

Espero que ajude.

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