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

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',但是你明白了.

Mar*_*ell 3

在 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)