是否可以像扩展.NET Framework类一样扩展.NET Framework命名空间?

9

1
除非我完全误解了你的意思,否则你不能只使用命名空间“System.Web”创建一个类吗? - Jamie Treworgy
为什么你想要做这样的事情? - Gabe
System.Web只是一个例子。如果您有一个带有一些类型(发票,联系人)的第三方程序集,并且您想为这些实体创建一个类型化的集合,那么可能会很有用,因此为了方便起见,将这些新集合放在同一个命名空间中似乎是有意义的。 - ChatGPT
3个回答

11

当然,可以尝试像这样的方法:

namespace System.Web
{
   public class ThisIsMyAdditionToSystemWeb
   {
   }
}

但显然,这样做不会向实际的.Net组件添加任何内容,想要利用您的“扩展”的项目必须引用您的程序集。


2
所以没有“sealed”命名空间 :) - user310291
即使代码编译无误,VS仍会报告各种错误(无法找到在系统中注入的类)。 - Radu Simionescu
@RaduSimionescu - 哦?在我的电脑上完美运行 ;) 愿意分享代码和错误吗?或许可以在SO上提出一个新问题。 - Peter Lillevold
@PeterLillevold 没关系,我只是忽略了这些错误。这可能只是我遇到的一个 IDE 错误。 - Radu Simionescu

10

没错,命名空间与任何特定程序集无关。它是让类使用者难以理解的绝佳方式。而且微软强烈反对使用"Microsoft"和"System"作为命名空间,这两个名称属于微软所有。如果将来的.NET更新与你的命名空间名称冲突,微软不会给予任何同情。


7
好的,你可以做到。恭喜!但是不要这样做。拜托了,千万不要。 - Anthony Pegram
不是与问题相关,但是汉斯,我认为你睡眠比著名的自动机器人Jon Skeet还要少。 - Jesse C. Slicer
1
说得好,你是对的,但为什么它会比方法扩展更容易发生冲突呢?如果我使用一个方法扩展来扩展.NET框架类,并且微软在未来决定使用相同的方法名称,那么也会发生冲突,我错了吗? - user310291
@user - 有一个区别,扩展方法是在现有类上创建的。他们会添加新的命名空间,并且不会考虑任何事情,向现有类添加新方法并不常见。 - Hans Passant
嗯...假设您想在GuidNullable<Guid>上创建IsNullOrEmpty扩展方法,这样您就不必一直将其与Guid.Empty进行比较。您希望该方法在Guid可用的任何地方都可用,因此将GuidExtensions类放在System命名空间中是有意义的吧?既然这样的扩展类永远不会在代码中直接引用,因此可以始终为该类添加唯一前缀。 - Triynko
我理解不使用其它“Microsoft保留”命名空间的原因,但最近我在.NET中编写了大量的P/Invoke代码,有时候只是为了添加某些功能到.NET中,而这些功能令我感到惊讶的是它们并不存在于.NET中。例如,CopyFileEx提供了文件复制功能,并利用系统资源(如DMA)来报告进度,而.NET没有相应的功能。当我创建自己的命名空间以模仿.NET的(System.*)时,会出现命名空间模糊,这很令人沮丧。我觉得将CopyFileEx添加到System.IO.File中会是一个很好的用途。 - Justin Shidell

3
问题中提到的示例使用扩展方法来扩展密封字符串类。你可以为任何类编写扩展方法,没有任何限制。
另外,正如其他人所说,扩展命名空间只需在创建新对象时声明该命名空间即可。但在执行此操作之前,请务必考虑其影响。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接