1

ASP.NET Web ページに GridView と DetailsView があります。どちらか一方を抽出してその情報を取得する必要があり、そのための関数を作成しました。GridView と DetailsView の両方に、関数で使用する必要がある Rows という名前のプロパティがあります。

したがって、コードには次のようなものがあります。

// Where dv is DetailsView and gv is GridView
if(someBool) 
   foo(dv); 
else
   foo(gv);

foo は次のようになります。

void foo(SomeBaseClassOrInterface dv) {
    foreach(var row in dv.Rows) {
       Use(row.Cells[2].Text); // Simply read each row
     }
}

DetailsViewRowCollection と GridViewRowCollection の操作は互いのミラーであるため、2 つの異なる関数を作成するのではなく、同じ関数を使用できると考えています。問題は、Rows プロパティを共有する基本クラスがないことです。

DetailsView と GridView から継承し、単に親の Row プロパティを使用する 2 つのクラスを作成しようとしましたが、どちらもメイン コードで使用するインターフェイスを実装していますが、機能していないようです。DetailsView と GridView の行の戻り値の型が異なる理由は、両方の戻り値の型が IEnumerable から継承されますが、インターフェイスを実装するクラスは、その行プロパティも IEnumerable を返す必要があります。ジェネリックを使用すると、この制限がバイパスされますが、呼び出しコードで失敗しますこれは、GridView と DetailsView を実装するオブジェクトを Interface 型に変換できないと訴えています。

私が見逃している非常に単純な解決策があると感じています。この場合、コードを複製する方が簡単かもしれません。

コードの重複を理想的に回避する良いアプローチを見つけようとしています。

ありがとう

4

3 に答える 3

0

1 つのオプション - このいずれかからの情報の取得を処理する「extractor」インターフェイスを作成します。2 つの実装を追加します。1 つは 用GridView、もう 1 つは 用DetailsViewです。

class CellType
{
   // some fields that are interesting like
   public string Text {get;set;}
}

class Row {
   public List<CellType> Cells {get;set}
}

interface IRowExtractor
{ 
     IEnumerable<Row> Rows {get};
}

class GVRowExtractor : IRowExtractor
{
   List<Rows> rows;
   public GVRowExtractor(GridView gv)
   {
        // fill Rows from gv
   }
   public IEnumerable<Row> Rows {get {return rows;}};
}

class DVRowExtractor : IRowExtractor ....

void foo(IRowExtractor dv) {
  foreach(var row in dv.Rows) {
     Use(row.Cells[2].Text); // Simply read each row
 }
}

使用法:

foo(new DVRowExtractor(dv));
于 2013-07-29T23:20:04.083 に答える