.net - 扩展方法类不能嵌套有充分的理由吗?

标签 .net extension-methods

我最近一直在大量使用扩展方法来帮助使我的代码更流畅,但我一直遇到无法限制我以我喜欢的方式创建的功能的公开的情况.

假设我有这样的代码(完全虚构的示例):

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

但我认为这是一个辅助方法,而不是真正的扩展,所以我想像限制私有(private)方法一样限制它的使用:

//In the same class
private static IEnumerable<string> SelectNameWhere(
                   this IEnumerable<Element> items,
                   Func<Element, bool> predicate)
...

不幸的是我不能这样做,因为持有扩展方法的类必须是静态的。好的,不是世界末日,我将嵌套一个私有(private)静态类来保存该方法……当然我也不能那样做,所以我要么至少将这个方法暴露给内部级别,或删除我的代码的优美、流畅的特性:

var liveSet = SelectNameFrom(allItems, x => x.Status == Status.Live);
...

这些关于在哪里可以声明扩展方法的限制对我来说似乎相当随意,但我认为它们有充分的逻辑或技术原因。如果有,它们是什么?

最佳答案

扩展方法类不嵌套的主要原因是为了让编译器更容易找到它们(同样的原因导致它们被限制在静态类中)。现在,编译器必须扫描命名空间下的所有静态类以找到方法。如果允许在所有类中嵌套或使用它们,那么编译器的工作就会困难得多。这也可能导致名称冲突。

例如:

public static class Foo
{
   public static void DoStuff(this object param)
   {
   }
   public static class Bar
   {
      public static void DoStuff(this object param)
      {
      }
   }
}

关于.net - 扩展方法类不能嵌套有充分的理由吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3583289/

相关文章:

C# 扩展方法不适用于递增和递减场景,是设计使然吗?

c# - 是否可以在 C# 中实现 mixins?

c# - C# : what will happen in this edge case? 中的通用扩展方法

c# - Automapper - 集合 <double> 中的 map 设置失败

.net - 您可以舍入 .NET TimeSpan 对象吗?

c# - 使用 .NET 驱动程序 2.0 在 MongoDB 中构建索引

.net - 使用客户端应用程序安装数据库的工具或最佳实践

c# - 为什么在 C# 中使用动态类型?

C# 返回类中所有必需属性的列表

objective-c - 在swift中调用objective-c扩展类中的方法