Методы расширения не разрешены во вложенных статических классах? - PullRequest
9 голосов
/ 21 апреля 2009

Почему это? Я бы посчитал действительно приятным иметь возможность заблокировать некоторые методы расширения для использования только в одном из моих классов. На самом деле я не хочу, чтобы некоторые методы расширения были доступны везде ... и они выглядят намного лучше, чем обычные статические методы: 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, мне было просто любопытно узнать, есть ли у кого-нибудь веские аргументы в пользу того, почему они решили поставить такое ограничение на использование методов расширения. Должен быть в статическом классе имеет смысл. Не может быть во вложенном статическом классе не ... для меня, по крайней мере ...

Ответы [ 3 ]

4 голосов
/ 21 апреля 2009

Если у вас есть исходный код типа, почему вы используете методы расширения? Почему бы вам просто не сделать эти методы расширения членами самого типа?

Методы расширения лучше всего использовать для расширения типов, которые вы не создавали. Хотя они являются полезными инструментами, они представляют собой слой косвенности, который должен быть последним средством, а не первым. Хотя вы можете использовать их для расширения ваших собственных типов, более разумно зарезервировать их для типов, которые вы не создавали.

2 голосов
/ 21 апреля 2009

Если вы расширяете тип, то методы расширения должны быть такими же доступными, как и сам тип.

Лучшие практики также предполагают размещение всех методов расширения в одном месте, предпочтительно в одном статическом классе или в одном пространстве имен.

1 голос
/ 21 апреля 2009

Действительно ли использование метода расширения сделает ваш код намного чище , чем использование стандартного вспомогательного метода в вашем классе?

// 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))
...