最近我一直在使用扩展方法来帮助我的代码更流利,但是我一直在遇到不能限制我以我想要的方式创建的功能的暴露情况。为什么扩展方法类不能嵌套是否有很好的理由?
说我有一些像这样的代码(完全由为例):
var liveSet = allitems.Where(x => x.Status == Status.Live).Select(x => x.Name);
var deadSet = allitems.Where(x => x.Status == Status.Dead).Select(x => x.Name);
var zombieSet = allitems.Where(x => x.Status == Status.Neither).Select(x => x.Name);
我想使这更流畅,并停止重复自己:
var liveSet = allitems.SelectNameWhere(x => x.Status == Status.Live);
...
但我认为这是一个辅助方法,而不是一个真正的扩展,所以我想限制它的使用方式,就像我可以使用私有方法一样:
//In the same class
private static IEnumerable<string> SelectNameWhere(
this IEnumerable<Element> items,
Func<Element, bool> predicate)
...
不幸的是我不能这样做,因为包含扩展方法的类必须是静态的。好吧,不是世界的尽头,我将嵌套一个私有的静态类来保存这个方法......当然,我也做不到这一点,所以我没有把这个方法暴露在至少一个内部层面上,或删除我的代码漂亮,流畅,自然:
var liveSet = SelectNameFrom(allItems, x => x.Status == Status.Live);
...
在那里你可以声明一个扩展方法,这些限制似乎相当任意的给我,但我认为他们有良好的逻辑或技术的原因。如果是这样,他们是什么?
不能对这个问题的技术细节发表评论。但它看起来像是在试图将功能拉大到不属于那里的扩展方法。通过存储库实现这些示例,并且问题消失。扩展*应该是全球性的。需要锁定他们的访问是一个非常糟糕的代码味道imho。 – fearofawhackplanet 2010-08-27 10:39:47
我同意在嵌套类中声明“本地”扩展方法通常很有用。或者,你可以声明它们在一个单独的命名空间,所以它们不会出现在任何地方 – 2010-08-27 10:44:38
我同意应该有一种方法来限制基于类(不只是命名空间)的扩展方法的范围。 – Vaccano 2012-05-16 21:53:16