【问题标题】:C# Obtaining Namespace Based on CSProj settingsC# 根据 CSProj 设置获取命名空间
【发布时间】:2015-08-23 04:41:30
【问题描述】:

有没有办法在不使用预处理器指令的情况下获得 .csproj 默认命名空间和 Visual Studios 理解它?

例如:

CS 项目 1 的默认命名空间为 SomeCompany.ProductA

CS 项目 2 的默认命名空间为 SomeCompany.ProductB

CS 项目 1 有一个 cs 文件存在于 BaseClasses/MySpecialBase.cs 中

CS 项目 2 有一个 链接文件 到另一个项目中的同一文件。这种方式维护一个文件版本,而不使用不同的程序集。

但是,CS 项目 2 现在有一个 cs 文件引用了 CS 项目 1 中的某些内容,因此类命名空间现在不正确。

是否有关键字可以在单个cs文件中使用当前csproject文件的Default Namespace

IE:[MyDefaultNameSpace].BaseClasses

如果可能的话,我想避免使用#if #else,所以我不必添加符号。

namespace [somekeywordhere].BaseClasses
{
     class MySpecialBase
     {
        ....
     }
}

【问题讨论】:

  • 链接文件仍将具有相同的命名空间 - 链接文件不会改变源。但您可以改为在项目 2 中使用 T4 模板,该模板将从项目 1 中复制文件,使用 CodeDom 读取和更新命名空间,然后将项目 2 中的新文件写出作为 T4 模板的输出。 IDE 将运行模板,因此保持其最新状态应该不会太棘手。那行得通吗?需要一个例子吗?

标签: c# .net c#-4.0 visual-studio-2013 namespaces


【解决方案1】:

不,无法在源代码中使用“默认命名空间”。样板 T4 模板使用它来自动准备新文件,但它是 Visual Studio 参数,而不是代码的实际属性。

正如您所说,这可以通过 #ifs 和符号的一些棘手用法来完成,或者正如 DaveC 所说,您可以准备一个 T4 模板来生成更正命名空间的副本(这不会使用链接)。无论如何,这涉及到一些工作。

当更深层次的构造(您的共享链接文件)使用更具体的东西(来自一个或另一个项目的代码)时,我看到了逻辑层次结构的倒置,因为我总是使用链接文件来处理某些东西像全局版本属性或其他程序集属性(例如公司、产品),所以这个共享文件从不依赖于“逻辑上”它上面的任何东西。但我想你有你的理由,只是说清楚。

【讨论】:

  • 正确,我有我的理由,即使它不是最佳的。只是想变得聪明。 T4 我们考虑过,ifdef 听起来最简单。只是在我这样做之前确保.net中没有任何东西。所以从技术上讲,这是正确的响应,除非有人可以证明不是这样,或者 .net 的未来版本包含一些新的关键字。谢谢!
【解决方案2】:

尝试使用“反射 API”-https://msdn.microsoft.com/en-us/library/ms173183.aspx 例如。

System.Type myNameSpaceAndClassName = this.getType()

【讨论】:

  • 我说的是项目中的实际来源......不是在运行时这样做。 IE:namesapce [somethinghere].BaseClasses{ class MySpecialBase {...}}
猜你喜欢
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 2017-07-13
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多