代码之家  ›  专栏  ›  技术社区  ›  Flipster

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

  •  5
  • Flipster  · 技术社区  · 14 年前

    这是一个关于.NET中扩展方法可见性(特别是C)的问题,以及为什么IntelliSense可以工作,但编译器在同一段代码上失败的原因。

    想象一下…

    我有.NET 3.5类库,它由一组对象和一个扩展方法类组成。以下是其中一种方法:

    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
    

    这似乎工作得很好,在键入字符串时,IntelliSense确实看到了挂起字符串实例的扩展方法:

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

    我喜欢一个计划结合在一起!

    然而,这就是快乐的终结。

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

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

    当试图直接将extensionmethods类复制到Web项目中时,生成再次失败。这一次,因为“this”这个词是不应该出现的。

    奇怪的是,extension方法确实像普通静态方法一样工作:

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

    …构建工作正常(所以问题不在于“this”关键字)。事实上,无论extensionmethods类在类库中还是在网站中,构建都是有效的。

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

    …但解决方案很糟糕。

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

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

    我尝试过“namespace system.runtime.compilerservices”技巧,但似乎没有帮助。

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

    注意:这个人为设计的示例变量应该被称为“name”而不是“firstname”,但是您会得到这个想法。

    3 回复  |  直到 14 年前
        1
  •  3
  •   Marc Gravell    14 年前

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

    <system.web>
        ....
        <pages ....>
            ....
            <namespaces>
                ....
                <add namespace="MyApp.Extensions" />
    

    您还需要确保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>
    
        2
  •  0
  •   Harendra    14 年前

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

        3
  •  0
  •   Zain Shaikh    14 年前

    我绝不会建议保持 Extension 任何内部方法 namespace .