嵌套静态类中不允许使用扩展方法?

时间:2009-04-21 12:36:13

标签: c# extension-methods nested-class

这是为什么?我会发现真的很高兴能够锁定一些扩展方法,只在我的一个类中使用。真的不想在任何地方都有某些扩展方法......而且它们看起来比常规静态方法好得多:P


澄清:

我想要这些扩展方法的原因是因为我正在扩展一个Form,它上面有一个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 个答案:

答案 0 :(得分:4)

如果您拥有该类型的源代码,为什么使用扩展方法?为什么不直接将这些扩展方法成为该类型的成员?

扩展方法最适合用于扩展您未创建的类型。虽然它们是有用的工具,但它们是一个间接层,应该是最后的手段,而不是第一个。虽然您可以使用它们来扩展自己的类型,但更有意义的是保留它们用于您未创建的类型。

答案 1 :(得分:2)

如果您要扩展类型,那么扩展方法应该与类型本身一样可以访问。

最佳实践还建议将所有扩展方法放在一个位置,最好是在一个静态类中,或者包含在一个名称空间中。

答案 2 :(得分:1)

使用扩展方法真的会让你的代码更清洁而不是在你的类上使用标准的帮助方法吗?

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