【问题标题】:Problem with recurring namespace-names重复命名空间名称的问题
【发布时间】:2011-01-26 20:04:19
【问题描述】:

我有一个名为AppVisum.Membership.Views.AppVisum.Membership.Controllers.Membership._Page_Views_AppVisum_Membership_Controllers_Membership_Validate_cshtml 的类。是的,我知道这很可怕,但我宁愿认为它必须命名,至于命名空间,这些是不必要的,但是类是由工具生成的,文件夹需要命名为AppVisum.Membership.Controllers.Membership,所以我不知道我是否可以更改名称空间。然而,丑陋的名字并不是真正的问题,主要问题是进入AppVisum.Sys.AppSys 类。 ide告诉我找不到AppVisum.Membership.Views.AppVisum.Sys.AppSys,那我怎么告诉它我要root呢?

[编辑]

抱歉,我说得不够具体,因为我认为这是一个很容易解决的问题。如果这是一个普通的 .cs 文件, global:: 会完美运行,但是,它是一个 razor 文件,并且 razor 不太喜欢 @using global::AppVisum.Sys(这只是转换为使用 global,这不会产生任何感觉)。我找到了 2 个可能的解决方案,第一个是简单地将搜索文件的规则更改为使用 _ 而不是 . 搜索文件夹。然后我会得到像AppVisum.Membership.Views.AppVisum_Membership_Controllers_Membership._Page_Views_AppVisum_Membership_Controllers_Membership_Validate_cshtml 这样的路径。这可能会很好,除非有人想出更好的选择,否则我想我会这样做。另一种选择是重写生成类的自定义工具(它是开源的,所以我认为我应该能够非常简单地做到这一点)。希望能澄清一些事情。

【问题讨论】:

  • 您应该更改程序集的默认命名空间。

标签: c# namespaces


【解决方案1】:

global:: 前缀添加到命名空间。

【讨论】:

  • 有什么方法可以让剃须刀使用它?它不接受@using global::AppVisum.Sys :-/
【解决方案2】:

尝试:

using Sys = AppVisum.Sys;

或:

using AppSys = AppVisum.Sys.AppSys;

基本上,您可以通过在 using 指令中为类型和命名空间设置别名来减少歧义。 (并且别名不需要与类型/命名空间名称相同,它们只是在我的示例中。)

【讨论】:

    【解决方案3】:

    正如 SLaks 在评论中提到的,您基本上应该修复项目的默认命名空间 - 要么,要么避免创建文件夹层次结构。您已经用 C# 标记了这个问题,但是您生成的代码实际上是在 VB 中吗?虽然 VB 编译器在编译时会预先添加项目的命名空间,但我不相信 C# 编译器会这样做,所以说实话,我很惊讶你得到了这个命名空间。

    我不同意你关于“丑陋的名字不是真正的问题”的说法 - 我会说它真正的问题,并且难以进入特定的命名空间是一个问题的后果。修复真正的问题(错误的命名空间),剩下的就会消失。使用global:: 等只是一种解决方法,您需要在所有地方应用。最好一劳永逸地解决这个问题。

    基本上,如果您能告诉我们更多关于您是如何陷入这种情况的,我们更有可能帮助您摆脱困境。

    【讨论】:

    • 嗯,基本上它是关于为我正在编写的应用程序框架(即 AppVisum)编译剃刀视图。但是,现在 AppVisum 要求将所有已编译的插件视图放在一个文件夹中,命名如下:~/Views/<ControllerFullName>/。换句话说,我在一个名为 Controllers 的文件夹中名为 AppVisum.Membership 的项目中有一个名为 Membership 的控制器,因此控制器的全名是 AppVisum.Membership.Controllers.Membership。这是为了确保视图不会相互冲突,例如会员和用户都可以拥有一个名为 edit.cshtml 的视图。
    • @alexandr:但你仍然可以更改默认命名空间(与项目名称分开)
    • 是的,但默认命名空间应该是 AppVisum.Membership,因为这就是项目的内容。它是 AppVisum 的会员插件,我真的不想改变它。这就是我构建所有项目部分的方式。
    • @Alxandr:命名空间还是程序集名称?
    • 如果我正确理解你的问题。我可以尝试多解释一下项目是如何构建的,但这需要一些时间。
    【解决方案4】:

    也许您可以通过添加使用别名来简化:

    using AV = AppVisum.Membership.Views.AppVisum;
    

    在代码中:

    var s = new AV.Sys.AppSys();
    

    【讨论】:

    • AppSys 类在 global::AppVisum.Sys 中。
    猜你喜欢
    • 2015-04-24
    • 1970-01-01
    • 2011-03-27
    • 2012-12-24
    • 2011-07-11
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 2011-02-05
    相关资源
    最近更新 更多