Fli*_*ter 5 c# methods intellisense
这是关于.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;
}
}
Run Code Online (Sandbox Code Playgroud)
要在类库本身中使用扩展方法,需要其中一个方法的每个类都需要指定:
using MyApp.Extensions;
Run Code Online (Sandbox Code Playgroud)
因为这是与库的其余部分不同的命名空间.所有这一切都很好.
现在,.Net 2.0网站正确引用了这个库,类文件希望使用该库.所以它声明它是:
using MyApp.Extensions
Run Code Online (Sandbox Code Playgroud)
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类是在类库还是Web站点中,构建都可以工作.
换句话说,这确实解决了问题,构建将成功.
......但解决方案很糟糕.
问题:在这种情况下,是否有某种秘密技巧可以使扩展方法正常工作?
http://www.flipscript.com/test/ToTitleCase.jpg
我已经尝试过"命名空间System.Runtime.CompilerServices"技巧,但这似乎没有帮助.
什么会导致Intellisense正确地看到扩展方法,并且编译器会失败?
注意:设计的示例变量应该被称为'name'而不是'FirstName',但是你明白了.
在 web.config 中,尝试添加到 system.web/pages/namespaces 节点
<system.web>
....
<pages ....>
....
<namespaces>
....
<add namespace="MyApp.Extensions" />
Run Code Online (Sandbox Code Playgroud)
您还需要确保 ASP.NET 编译器处于 3.5 模式:
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" warningLevel="4"
type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<providerOption name="CompilerVersion" value="v3.5"/>
<providerOption name="WarnAsError" value="false"/>
</compiler>
</compilers>
</system.codedom>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1035 次 |
| 最近记录: |