質問

.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< object> に保存することです。

非ジェネリックメソッドで 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 から継承させ、その配列を返します。ただし、型の安全性はすべて失われます。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top