拡張メソッドは、ネストされた静的なクラスで許可されていませんか?
-
12-09-2019 - |
質問
これはなぜでしょうか?私はそれ本当にの素敵なだけで私のクラスの1つに使用されるようにロックダウンされ、いくつかの拡張メソッドを持つことができるように見つけるだろう。本当にどこでも利用できる特定の拡張メソッドを持つようにしたい...と彼らは通常の静的メソッドよりもはるかに良く見ていない:Pを
<時間>明確にするためます:
私はそれにDataGridViewのを持っているフォームを、拡張していますので、私はこれらの拡張メソッドをしたい理由があります。そして、私はこれらのような行の非常に疲れています:
foreach(var row in grid.Rows.OfType<DataGridViewRow>().Where(r => (bool) r.Cells[checkBoxColumn.Index].Value))
foreach(var row in grid.SelectedRows.OfType<DataGridViewRow>().Where(r => (bool) r.Cells[checkBoxColumn.Index].Value))
私は何ができるように、拡張メソッドをご希望
foreach(var row in grid.Rows.CheckedRows())
foreach(var row in grid.SelectedRows.CheckedRows())
だから、他の言葉で、この拡張メソッドは、このクラスの外では、すべての有用ではありません。しかし、それはコードロットきれいになるだろう。もちろん、あまりにも通常のメソッドを作成し、これが不可能だったので、それは、私がやってしまったものですすることができます。
Aaanyways、私は誰もが、彼らが拡張メソッドを使用し作成することができます場所によって、このような制限を置くことを選択した理由にはいくつかの良いの引数を持っていたかどうかを知るためにだけ興味がありました。 はの合計理にかなって静的クラスである必要があります。 は、ネストされた静的なクラスにすることはできません。のない...私には、少なくとも...
解決
本当にのロットクリーナーのあなたのクラスでの標準的なヘルパーメソッドを使用するよりも、あなたのコードを作成する拡張メソッドを使用しますか?
// extension method
foreach (var row in grid.Rows.CheckedRows())
foreach (var row in grid.SelectedRows.CheckedRows())
// standard helper method
foreach (var row in CheckedRows(grid.Rows))
foreach (var row in CheckedRows(grid.SelectedRows))
他のヒント
、なぜあなたは、拡張メソッドを使用していますか?あなただけのタイプ自体のものを拡張メソッドのメンバーをしないのはなぜ?
拡張メソッドは、最高のあなたが作成していないタイプを拡張するために使用されています。彼らは便利なツールですが、彼らは最後の手段ではなく、最初にあるべき間接の層です。あなたがあなた自身の種類を拡張するためにそれらを使用することができますが、それはあなたが作成していないタイプのためのそれらの使用を確保するために、より理にかなっています。
、その後、拡張メソッドは、型自体と同じくらいequalyアクセスできる必要があります。
ベスト・プラクティスはまた、好ましくは、1つの静的クラスでは、一箇所にすべての拡張メソッドを置くか、単一の名前空間内に含まれることをお勧めします。