Сохранение открытого универсального типа в массиве?
Вопрос
Я столкнулся с проблемой с дженериками .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 и возвращать его массив.Однако вы потеряете всю безопасность типов.
Надеюсь, это поможет.