2008-09-12 24 views
2

私は.NETジェネリックの問題に直面しています。私がやりたい事はジェネリックタイプ(GraphicsItem)の配列を保存している:オープンなジェネリック型を配列に保存していますか?

public class GraphicsItem<T> 
{ 
    private T _item; 

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

私は配列で、このようなオープンジェネリック型を保存することができますどのように?

答えて

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

異種GrpahicsItemのGraphicsItem < X>およびGrpahicsItem < Y>を保存する場合は、それらを共通の基本クラスから派生させるか、共通のインターフェイスを実装する必要があります。別のオプションは、リストにそれらを格納することです<オブジェクト>

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を継承させ、その配列を返します。あなたはすべてのタイプの安全性を失うでしょう。

希望に役立ちます。

関連する問題