包装在命名空间困境中的 "site.master"模板中的 C# 扩展方法

标签 c# asp.net

问题是这样的,为什么我需要在我的 Site.Master 文件上添加一个“import”指令来获得 Intellisense,而 html 助手在没有它的情况下也能工作。

使用没有命名空间的简单 C# 字符串扩展方法 == 没问题。但是,我想将此扩展放在命名空间中以成为一名优秀的程序员。

如果我将它包装在一个命名空间中,您必须做几件事。这是我的扩展:

namespace MySystemCore
{
    public static class StringExtensions
    {
        public static string F(this string s, params object[] args)
        {
            return string.Format(s, args);
        }
    }
}

因此,通过反复试验,我让它工作了,但我想分享我的观察结果。希望它可以在将来帮助其他人。

注意:我在 Site.Master

中使用扩展方法
  1. 添加“使用 MySystemCore;”到 Site.Master.cs 文件(代码隐藏文件)

    • 运行时错误,未找到扩展方法
  2. 将“<add namespace="MySystemCore">”添加到<namespaces> web.config

    中的配置 block
    • 有效,没有智能感知
  3. 合并 #1 和 #2

    • 有效,没有智能感知
  4. 将“<%@ Import Namespace="MySystemCore" %>”添加到Site.Master 文件

    • 可以使用智能感知

最佳答案

这是一个 VS 限制,当您将它添加到 web.config 中的 时,IntelliSense 不会显示。

但为了完整起见,我将讨论它的原因:

  • 方法 1 根本不是正确的方法,因为 using 指令(Imports 将编译为 usingASP.NET 预处理器)限定为一个编译单元(即单个文件)
  • 方法 2 运行正常,因为它向编译选项添加了 using 指令,这会影响应用程序中的所有编译单元。如果在这种情况下 IntelliSense 没有出现,那是因为 VS 不够智能,无法考虑 web.config
  • 方法 3 和方法 2 一样有效。方法 1 与主文件完全无关,它只影响我之前提到的 .cs 文件。方法 2 就像自动添加 using 到所有 .cs 文件。
  • 方法 4 之所以有效,是因为 VS 知道您在它正在处理的同一个文件中使用它。
  • 关于包装在命名空间困境中的 "site.master"模板中的 C# 扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/303938/

    相关文章:

    java - 警告 Xamarin android - 未提供 -tsa 或 -tsacert 并且此 jar 没有时间戳

    c# - Fluent API 的类型推断

    c# - RightClick 上的 ContextMenuStrip,如果在 ListView 中选择了项目?

    .net - 具有 Winforms、WPF 和 ASP.NET 自由许可证的开源控制库

    asp.net - 将 Grunt、Bower、Gulp、NPM 与 Visual Studio 2015 结合使用用于 ASP.NET 4.5 项目

    c# - 使用数据属性使 web api 以键值作为键序列化字典

    c# - 从 JavaScript 访问 C# 变量

    c# - DDD 中聚合中的读取模型是什么以及在哪里使用它们?

    c# - log4net AdoNetAppender - SqlParameterCollection 不包含参数

    c# - 在没有 Global.asax 的情况下,如何在 ASP.NET 中获取 Web 应用程序程序集?