我最近一直在使用扩展方法来帮助我的代码更流畅,但是我一直在遇到无法限制我创建的功能的方式我喜欢的方式
说我有一些像这样的代码(完全构成示例):
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);
...
对于我可以声明扩展方法的这些限制对我来说似乎相当随意,但我认为它们具有良好的逻辑或技术原因。如果是这样,他们是什么?
答案 0 :(得分:3)
扩展方法不是嵌套的主要原因是使编译器更容易找到它们(同样的原因导致它们被限制为静态类)。现在,编译器必须扫描命名空间下的所有静态类以查找方法。如果允许在所有类中嵌套或使用它们,那么编译器的工作将更加困难。这也可能导致名称冲突。
例如:
public static class Foo
{
public static void DoStuff(this object param)
{
}
public static class Bar
{
public static void DoStuff(this object param)
{
}
}
}
答案 1 :(得分:0)
您不希望公开扩展方法的事实应该清楚地表明您的函数不应该是扩展方法。扩展方法旨在以更友好的方式公开类型上的现有功能。