Domanda

Sto affrontando un problema con i generici .NET.La cosa che voglio fare è salvare una serie di tipi generici (GraphicsItem):

public class GraphicsItem<T>
{
    private T _item;

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

Come posso salvare un tipo generico così aperto in un array?

È stato utile?

Soluzione

Implementa un'interfaccia non generica e utilizzala:

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

Quindi utilizza quell'interfaccia come elemento nell'elenco:

var values = new List<IGraphicsItem>();

Altri suggerimenti

Se si desidera archiviare GrpahicsItem eterogenei, ad esempioGraphicsItem< X> e GrpahicsItem< Y> è necessario derivarli dalla classe base comune o implementare un'interfaccia comune.Un'altra opzione è memorizzarli in List< oggetto>

Stai provando a creare un array di GraphicsItem in un metodo non generico?

Non è possibile effettuare le seguenti operazioni:

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

e poi riempire l'elenco più tardi.

Più probabilmente stai cercando di fare qualcosa del genere?

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

Ricorda che avrai bisogno di un riferimento a un tipo generico per creare un array di un tipo generico.Questo può essere a livello di metodo (usando la T dopo il metodo) o a livello di classe (usando la T dopo la classe).

Se vuoi che il metodo restituisca un array di GraphicsItem e GraphicsItem, lascia che GraphicsItem erediti da una classe base non generica GraphicsItem e restituisca un array di quello.Perderai però tutta la sicurezza del tipo.

Spero che aiuti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top