在数组中保存开放泛型类型?

时间:2008-09-12 05:52:05

标签: .net generics

我遇到了.NET泛型的问题。我想要做的是保存一组泛型类型(GraphicsItem):

public class GraphicsItem<T>
{
    private T _item;

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

如何在数组中保存这样的开放泛型类型?

3 个答案:

答案 0 :(得分:4)

实现非通用接口并使用:

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

答案 1 :(得分:0)

如果你想存储异构的GrpahicsItem,即GraphicsItem&lt; X&GT;和GrpahicsItem&lt; Y'GT;您需要从公共基类派生它们,或实现通用接口。另一种选择是将它们存储在List&lt;对象&gt;

答案 2 :(得分:0)

您是否尝试使用非泛型方法创建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继承并返回一个数组。你会失去所有类型的安全。

希望有所帮助。