Question

Je suis confronté à un problème avec les génériques .NET.La chose que je veux faire est de sauvegarder un tableau de types génériques (GraphicsItem) :

public class GraphicsItem<T>
{
    private T _item;

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

Comment puis-je enregistrer un tel type générique ouvert dans un tableau ?

Était-ce utile?

La solution

Implémentez une interface non générique et utilisez-la :

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

Utilisez ensuite cette interface comme élément dans la liste :

var values = new List<IGraphicsItem>();

Autres conseils

Si vous souhaitez stocker des GrpahicsItem hétérogènes, c'est-à-direGraphicsItem< X> et GrpahicsItem< Y> vous devez les dériver de la classe de base commune ou implémenter une interface commune.Une autre option consiste à les stocker dans List<object>

Essayez-vous de créer un tableau de GraphicsItem dans une méthode non générique ?

Vous ne pouvez pas effectuer les opérations suivantes :

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

puis remplissez la liste plus tard.

Plus probablement, vous essayez de faire quelque chose comme ça ?

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

N'oubliez pas que vous aurez besoin d'une référence de type générique pour créer un tableau d'un type générique.Cela peut être soit au niveau de la méthode (en utilisant le T après la méthode), soit au niveau de la classe (en utilisant le T après la classe).

Si vous souhaitez que la méthode renvoie un tableau de GraphicsItem et GraphicsItem, laissez GraphicsItem hériter d'une classe de base non générique GraphicsItem et renvoyez un tableau de celle-ci.Cependant, vous perdrez tout type de sécurité.

J'espère que cela pourra aider.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top