2010-12-28 6 views
2

私はこの例で私の質問を説明させてくださいC#別のクラスで使用するクラスを拡張するには?</p> <p>私はDataTableのとのDataColumnを拡張する場合:

class MyTable: DataTable 
{ 
    // Columns in here. 
} 

class MyColumn: DataColumn 
{ 
} 

私の質問は、私はむしろ、MyTableというクラスの列が拡張MYCOLUMNを使用させることができる方法であり、元のDataColumnよりも?

ありがとうございました。

+2

をあなたがDALのデザインパターンを使用してに見たいと思うかもしれません特定のデータ表現(例えば、DataTable)に直接結合するのではなく、任意選択的にORMと結合される。永続化レイヤーを抽象化し、拡張可能(仮想メソッド、抽象メソッド、または単にインターフェイス)となるように設計すると、このような問題はもっと簡単になります。 http://en.wikipedia.org/wiki/Data_access_layer –

+0

@Merlyn Morgan-Grahamに全面的に同意します。これを行うより良い方法があります。 – Randolpho

+0

ADO.NET DataTableクラスとDataColumnクラスを意味しますか? –

答えて

2

私はあなたが達成しようとしているものが正確ではありませんが、基本オブジェクトから派生するのがおそらく最善のルートです。この1にC#の拡張機能を持つスピン...

public class MyDataColumnCollection : InternalDataCollectionBase 
    { 
     private readonly ArrayList _list = new ArrayList(); 

     protected override ArrayList List 
     { 
      get 
      { 
       return this._list; 
      } 
     } 
     public void Add(MyDataColumn c) 
     { 
      this.List.Add(c); 
     } 
    } 

    public class MyDataTable : DataTable 
    { 
     private MyDataColumnCollection _columns = new MyDataColumnCollection(); 
     public new MyDataColumnCollection Columns 
     { 
      get { return this._columns; } 
     } 
    } 

    public class MyDataColumn : DataColumn 
    { 
     public string MyCustomProperty { get; set; } 
    } 

    static void Main(string[] args) 
    {   
     MyDataTable t = new MyDataTable(); 
     MyDataColumn c = new MyDataColumn(); 

     c.ColumnName = "My Test Column"; 
     c.MyCustomProperty = "This is really cool!"; 
     t.Columns.Add(c); 

     foreach (MyDataColumn mdc in t.Columns) 
     { 
      System.Diagnostics.Debug.WriteLine(mdc.MyCustomProperty); 
     }   
    } 

カスタムKeyedCollectionとソース<>

public class MyDataColumnCollection : 
    KeyedCollection<string, MyDataColumn> 
{ 
    protected override string GetKeyForItem(MyDataColumn item) 
    { 
     return item.ColumnName; 
    } 
} 

public class MyDataTable : DataTable 
{ 
    private MyDataColumnCollection _columns = new MyDataColumnCollection(); 
    public new MyDataColumnCollection Columns 
    { 
     get { return this._columns; } 
    } 
} 

public class MyDataColumn : DataColumn 
{ 
    public string MyCustomProperty { get; set; } 
} 

static void Main(string[] args) 
{ 

    MyDataTable t = new MyDataTable(); 
    MyDataColumn c = new MyDataColumn(); 

    c.ColumnName = "My Test Column"; 
    c.MyCustomProperty = "This is really cool!"; 
    t.Columns.Add(c); 

    foreach (MyDataColumn mdc in t.Columns) 
    { 
     System.Diagnostics.Debug.WriteLine(mdc.MyCustomProperty); 
    } 

    MyDataColumn testColumn = t.Columns["My Test Column"]; 
    System.Diagnostics.Debug.WriteLine(testColumn.MyCustomProperty); 
} 

ソリューション付け:

namespace ExtensionMethods 
{ 
    public static class MyExtensions 
    { 
     public static void UpdateValue(this DataTable dt) 
     { 
      // add code to update data in the DataTable 
     } 
    } 
} 

// in another class... 
DataTable myDataTable = (Get DataTable object); 
myDataTable.UpdateValue(); 
+0

これは私が望むように見えます。私はまだいくつかの混乱を持っています。 「public MyDataColumnCollection Columns」によれば、元の「列」は新しい列に置き換えられますが、元の列が元のデータ列から拡張されているため、データ列の元の機能は引き続き保持されます。私は正しい? – Jfly

+0

また、元の列の要素にアクセスするには、キーを使用します。これはどのようにArrayListで行うことができますか? – Jfly

+0

Q1:真の声明。 Q2:ArrayListは、元のColumnsコレクションが内部的に使用するものです。あなたはいつも自分のコレクションでこれを置き換えることができます。 –

2

MyColumnsがDataColumnから派生している場合、それらをDataColumnとしてキャストされたDataTableに配置できます。 MyTableは列を抽出し、MyColumnにアップキャストします。

これは最適な方法ではありません。 ADO.NET 2より以外のを使用する方が良いかもしれません。しかし、それがあなたが行かなければならない経路なら、それはあなたにとっての選択肢です。

注:InvalidCastExceptionが問題にならないように、アップキャストする前に必ずDataColumnオブジェクトの型をテストしてMyColumnにする必要があります。

+0

@Chris Gesslerの方法で試した後。私は欲しいものを手に入れましたが、もっと多くのものを追加してからは複雑になりました。それはもっと簡単な方法です。あなたは他の選択肢があると言いました。 ORMまたはDALフレームワークを意味しますか?私はちょっと試しましたが、彼らは私にとっては重すぎるようです。 – Jfly

0

もう1つの解決策は、インターフェイスを使用することです。

たとえば、IDataColumnとIDataTableのインターフェイスを定義します。 これらの各実装は、インターフェイスから継承します。

DataTableオブジェクトを初期化するときに、適切なMyColoum1、My​​Coloum2などを渡します。 これはポリモーフィズムによく似ていますが、インターフェイスは特定の実装なしに絶対契約を定義することができます。

+1

DataTableとDataColumnは、@ Jflyが明らかに利用しようとしている既存の型であり、要約/コントラクト/インタフェースを使用または定義していない点を除いて、これは問題ありません。 – Randolpho

関連する問題