代码之家  ›  专栏  ›  技术社区  ›  ollifant

是否在数组中保存打开的泛型类型?

  •  2
  • ollifant  · 技术社区  · 16 年前

    我面临.NET泛型的问题。我要做的是保存泛型类型数组(GraphicsItem):

    public class GraphicsItem<T>
    {
        private T _item;
    
        public void Load(T item)
        {
            _item = item;
        }
    }
    

    3 回复  |  直到 9 年前
        1
  •  4
  •   Omer van Kloeten    16 年前

    实现非通用接口,并使用:

    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>();
    
        2
  •  0
  •   aku    16 年前

        3
  •  0
  •   Alex Duggleby    16 年前

    您正在尝试使用非泛型方法创建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继承并返回该基类的数组。但是,您将失去所有类型安全性。

    希望有帮助。