2011-02-02 11 views
6

愚かなタイトルについて申し訳ありませんが、これをどのように言いたいのか分かりませんでした。C#:非ジェネリッククラス内の2つの抽象リストの実装?

私は同じタイプの2つのリストを持つクラスを作成しています。これは、最初のリストのオブジェクトへの参照を2番目のリストにコピーするために使用されます。

両方のリストは同じ型(オブジェクトの同じ型を保持)ですが、このクラスが初期化されるたびに異なることがあります。

私はリストタイプを抽象リストのようなものにする必要があると推測しています。インスタンス化されたときに強く型付けされていることを確認したいと思います(ただし、問題がある場合は必要ありません)。問題は、選択された項目をlist1からlist2に移動するメソッドの中にあります。抽象リスト型は通常、そのためのメソッドを持っていません。

私は、このクラスがWPF UserControlを継承しているので、クラスを汎用(className <T> thingy)にするのが普通だと思いますが、私はそれを行うことができません。

public partial class SubsetSelectionLists : UserControl 
{ 
    public static DependencyProperty SetCollectionProperty = DependencyProperty.Register("SetCollection", typeof("Need a abstract list type here"), typeof(SubsetSelectionLists)); 
    public static DependencyProperty SubsetCollectionProperty = DependencyProperty.Register("SubsetCollection", typeof("Need a abstract list type here"), typeof(SubsetSelectionLists)); 

    public "Need a abstract list type here" SetCollection 
    { 
     get 
     { 
      return ("Need a abstract list type here") GetValue(SetCollectionProperty); 
     } 
     set 
     { 
      SetValue(SetCollectionProperty, value); 
     } 
    } 

    public "Need a abstract list type here" SubsetCollection 
    { 
     get 
     { 
      return ("Need a abstract list type here")GetValue(SubsetCollectionProperty); 
     } 
     set 
     { 
      SetValue(SubsetCollectionProperty, value); 
     } 
    } 

    public SubsetSelectionLists() 
    { 
     InitializeComponent(); 
     SubsetSelectiongrid.DataContext = this; 
    } 

    private void selectionBtnClick(object sender, RoutedEventArgs e) 
    { 
     SubsetCollection.AddTheseItems(SET.SelecctedItems) 
    } 

    private void removeBtnClick(object sender, RoutedEventArgs e) 
    { 
     SUBSET.RemoveTheseItems(SUBSET.SelectedItem); 
    } 
} 

EDIT:ここ

はコードであるソリューション

いくつかの答えは、ジェネリッククラスを作成するのに最適な解決に向けて、私を指摘しました。しかし、これはWPFで問題になる可能性があります。トップレベルのジェネリッククラスでXAMLをスキップする必要があります。

これは、あなたがやりたいことではないタイプ固有の子クラスでXAMLを行うことができるということを意味します(コードだけを再利用するが、外観は可変でない限り)。あなたは、私が推測するコードを使ってコントロールを設計することもできましたが、どのように効果的かはわかりません。

私は、他の多くの人が継承している抽象リストであるIListオブジェクトを指していました。私は使用しようとしています。これは少しハックですが、オープンライブラリーでは使用されないので、私はそれで大丈夫です。それ以外の場合は、Generic Routeを使用します。

+0

linqで実行できない理由がありますか? .netのバージョンに制限がありますか? – phillip

+0

どのような.netバージョン。 Linqとジェネリックスはそれを行うことができるはずです – Hawxby

+2

linqが私にここで助けてくれるのか分かりませんか?どのようにして答えをしてください。私は.net 3.5を使用していますが、おそらく4.0にアップグレードします –

答えて

3

私は、デザイナーがジェネリッククラスであるユーザーコントロールをどれだけうまく演奏しているかわかりません。それが問題であれば(それは私が推測すると)、それから離れていく方法の1つは、コレクションにIListを公開することですが、実行時に型の安全性をストレージに組み込んだList<T>を使用することです作成し、それらを露出させるためのプロパティは、ように、必要に応じて)DependencyPropertyのコードを追加して:

public class YourControl : UserControl 
{ 

    // this method will set up the internal lists for accepting 
    // objects of the specified type only 
    public void SetListType(Type containedType) 
    { 
     var listType = typeof(List<>).MakeGenericType(new[] { containedType }); 
     SetCollection = (IList)Activator.CreateInstance(listType); 
     SubsetCollection = (IList)Activator.CreateInstance(listType); 
    } 
    public IList SetCollection { get; private set; } 
    public IList SubsetCollection { get; private set; } 
} 

// usage example: 
theControl.SetListType(typeof(string)); 
theControl.SetCollection.Add("some string"); // works ok 
theControl.SetCollection.Add(42); // fails, 42 is not a string 

明白な欠点はSetCollectionSubsetCollectionは「型なし」objectリストを公開するということです。

+0

これは役に立ちました。 Addメソッドを実装しているので、IListを使用できます。 IListを継承するリスト(ObservableCollectionの場合)を結びつけるようにします。各リストは型保証されていますが、それらが同じ型であることを保証するものではありません。 –

2

あなたが言うように、ジェネリッククラスはこれを達成する方法であり、ジェネリックでない親クラスから継承するときに行うことができます。すなわちもちろん

​​

上記のクラスにジェネリック型を修正(デザイナーで使用することができます)型指定されたクラスを定義し

以下のコメントをもとに

partial class GenericClass1<T> : UserControl 
    { 
    private List<T> _list; 
    } 

EDIT、これは実際にはあなたのリストに保持したいタイプの限定された/静的なセットがある場合にのみ有効です

+0

非ジェネリック親がWPF UserControlクラスでない限り。私はこれをやろうとしましたが、部分クラスであることに気付き、XAMLでそのクラスの残余が宣言されました。あなたが一般的なユーザーコントロールを作成できないと主張している投稿が見つかりました。 –

+0

ジェネリッククラスを定義したら、WPFユーザーコントロールとして機能する型指定されたサブクラスを定義することはできませんか? –

+0

問題は、XAMLにあるコードであるジェネリックとして部分的な部分の残りの半分を定義することができないということです。クラスはコンパイルされません。私はXAMLの部分を持たないクラスを作成することができましたが、その後、コード内や、発生したくないすべてのサブクラスで、外観(すべてのサブクラスでも同じです)を設計する必要があります。あなたの投稿を役に立つとマークしています。 –

3

マークの幅が広い?

+0

まあ私は私の質問でこれは通常行われる方法です。しかし、WPFのuserControlから継承しているため、動作していないようです。 –

+0

私は抽象クラスとしてクラスをマークし、それから継承するコントロールクラスを作成し、タイプを指定することができます。 – Hawxby

+0

私はまだUserControlクラスを元々継承する必要があり、これはXAMLコードをスキップして、コード内または各子(最初の場所では避けようとしている)でデザインする必要があることを保証します。私は部分的なものを飛ばしてXAMLを無視すればあなたの方法を使うことができますので、私はあなたに有用な投票をしています。 –

関連する問題