.Net扩展方法(此字符串Foo)仅部分可见

这是关于.Net中扩展方法可见性(特别是C#)的问题,以及为什么intellisense可能有效,但编译器在同一段代码上失败。

想象一下……

我有.Net 3.5类库,由一堆对象和一个Extension Methods类组成。 以下是其中一种方法:

namespace MyApp.Extensions { public static class ExtensionMethods { public static string ToTitleCase(this string Origcase) { string TitleCase = Origcase; ... implementation ... return TitleCase; } } 

要在类库本身中使用扩展方法,需要其中一个方法的每个类都需要指定:

 using MyApp.Extensions; 

因为这是与库的其余部分不同的命名空间。 所有这一切都很好。

现在,.Net 2.0网站正确引用了这个库,类文件希望使用该库。 所以它声明它是:

 using MyApp.Extensions 

SEEMS工作得很好,当键入一个字符串时,Intellisense确实看到悬挂在字符串实例上的扩展方法:

http://www.flipscript.com/test/ToTitleCase.jpg

当计划结合在一起时,我喜欢它!

然而,这是快乐的结束。

尝试构建网站时,构建失败并显示以下消息:

http://www.flipscript.com/test/titlecaseerror.jpg

尝试将ExtensionMethods类直接复制到Web项目时,构建再次失败。 这一次,因为没有预料到“这个”这个词。

奇怪的是,扩展方法确实可以作为普通的静态方法:

http://www.flipscript.com/test/titlecaseok.jpg

…并且Build工作得很好(所以问题实际上并不是“this”关键字)。 事实上,无论ExtensionMethods类是在类库还是网站中,构建都可以工作。

换句话说,这确实解决了问题,构建将成功。

……但解决方案很糟糕。

问题:在这种情况下,是否有某种秘密技巧可以使扩展方法正常工作?

http://www.flipscript.com/test/ToTitleCase.jpg

我已经尝试了“命名空间System.Runtime.CompilerServices”技巧,但这似乎没有帮助。

什么会导致Intellisense正确地看到扩展方法,并且编译器会失败?

注意:设计的示例变量应该被称为’name’而不是’FirstName’,但你明白了。

在web.config中,尝试添加到system.web / pages / namespaces节点

  ....  ....  ....  

您还需要确保ASP.NET编译器处于3.5模式:

         

您的网站使用.Net 2.0运行,它不支持扩展方法/类。 所以.NET 2.0编译器将其视为普通的静态方法。 它只会在.net 3.5中编译

我绝不会建议将Extension方法保留在任何namespace