2

.NET ジェネリックの問題に直面しています。私がやりたいことは、ジェネリック型 (GraphicsItem) の配列を保存することです。

public class GraphicsItem<T>
{
    private T _item;

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

このようなオープンジェネリック型を配列に保存するにはどうすればよいですか?

4

3 に答える 3

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>();
于 2008-09-12T07:50:38.567 に答える
0

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

于 2008-09-12T06:18:20.207 に答える
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 から継承し、その配列を返すようにします。ただし、すべての型の安全性が失われます。

それが役立つことを願っています。

于 2008-09-12T06:22:01.900 に答える