Сохранение открытого универсального типа в массиве?

StackOverflow https://stackoverflow.com/questions/58384

  •  09-06-2019
  •  | 
  •  

Вопрос

Я столкнулся с проблемой с дженериками .NET.Я хочу сохранить массив типов обобщений (GraphicsItem):

public class GraphicsItem<T>
{
    private T _item;

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

Как я могу сохранить такой открытый универсальный тип в массиве?

Это было полезно?

Решение

Реализуйте неуниверсальный интерфейс и используйте его:

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

Затем используйте этот интерфейс как элемент в списке:

var values = new List<IGraphicsItem>();

Другие советы

Если вы хотите хранить гетерогенные GrpahicsItem, т.е.GraphicsItem< X> и GrpahicsItem< Y>, вам необходимо вывести их из общего базового класса или реализовать общий интерфейс.Другой вариант — сохранить их в List<объект>.

Вы пытаетесь создать массив GraphicsItem неуниверсальным методом?

Вы не можете сделать следующее:

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

а затем заполните список позже.

Скорее всего, вы пытаетесь сделать что-то подобное?

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

Помните, что для создания массива универсального типа вам понадобится ссылка на универсальный тип.Это может быть либо на уровне метода (с использованием буквы T после метода), либо на уровне класса (с использованием буквы T после класса).

Если вы хотите, чтобы метод возвращал массив GraphicsItem и GraphicsItem, позвольте GraphicsItem наследовать от необщего базового класса GraphicsItem и возвращать его массив.Однако вы потеряете всю безопасность типов.

Надеюсь, это поможет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top