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 型に変換できないと訴えています。
私が見逃している非常に単純な解決策があると感じています。この場合、コードを複製する方が簡単かもしれません。
コードの重複を理想的に回避する良いアプローチを見つけようとしています。
ありがとう