8

このようなことが可能かどうか/どのように可能かを誰かが理解してくれることを願っています。

このシナリオでは、スプレッドシートや DB のようなグリッドをモデル化しようとしていると想像してください。ただし、各列のデータは 1 つのデータ型のみにすることができます。

例: 列 1 には整数のみを含めることができます。

次のような列構造をモデル化するジェネリック クラスを作成しました。

public class CollectionColumn<T>
{
private string _name;
private string _displayName;

private List<T> _dataItems = new List<T>();

public string Name {
    get { return _name; }
    set { _name = value; }
}

public string DisplayName {
    get { return _displayName; }
    set { _displayName = value; }
}


public List<T> Items {
    get { return _dataItems; }
    set { _dataItems = value; }
}
}

今私がやりたいことは、独自のプロパティを持つさまざまな列 (CollectionColumn、CollectionColumn などがある可能性があります) のコンテナーを用意することですが、列とデータにアクセスできる場所でそれを行う方法がわかりません。私がそれらのタイプを知らないとき、それらの中で。

これは .NET 2.0 プロジェクトなので、動的のようなものは機能しません。オブジェクトのリストでしょうか? インターフェイスでこれを行う方法があるかどうかもわかりません。

public class ColumnCollection
{
public int Id { get; set; }
public string ContainerName { get; set; }

private List<CollectionColumn<T>> _columns;
public List<CollectionColumn<T>> Columns {
    get { return _columns; }
    set { _columns = value; }
}

}

私ができるようにしたいのは、さまざまな CollectionColumn を ColumnCollection の Columns コレクションに追加して、さまざまな種類のデータを含む列を持つことができるようにすることです。

どんな助けでも大歓迎です。

4

1 に答える 1

11

これはかなり一般的な問題です。必要なことは、ジェネリック クラスが継承する非ジェネリック基本クラスを宣言するか、ジェネリック クラスが実装する非ジェネリック インターフェイスを宣言することです。その後、そのタイプのコレクションを作成できます。

例えば、

public abstract class CollectionColumnBase
{
    private string _name;
    private string _displayName;

    public string Name {
        get { return _name; }
        set { _name = value; }
    }

    public string DisplayName {
        get { return _displayName; }
        set { _displayName = value; }
    }

    public abstract object GetItemAt(int index);
}

public class CollectionColumn<T> : CollectionColumnBase
{
    private List<T> data = new List<T>();

    public overrides object GetItemAt(int index)
    {
        return data[index];
    }

    public List<T> Items
    {
        get { return data; }
        set { data = value; }
    }
}

public class ColumnCollection
{
    public int Id { get; set; }
    public string ContainerName { get; set; }

    private List<CollectionColumnBase> _columns;
    public List<CollectionColumnBase> Columns {
        get { return _columns; }
        set { _columns = value; }
    }
}
于 2012-08-19T00:39:08.360 に答える