.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
。