别名const隐藏全局const

时间:2015-08-13 16:54:35

标签: c#

背景

该解决方案是一个MVC Web应用程序,它连接到同一API的两个版本。连接器是类库,其中API的wsdl的相应版本被消费到代理类中。 Web项目引用两个库(具有相同的命名空间)。旧的,较少使用的版本是别名,较新的版本使用全局别名来尝试减少代码库周围的别名限定符的数量。

问题

当尝试访问较新的全局引用中的常量字符串时,我会收到较旧的别名库的值。

  //New v6
  public class AgeCode
  {
    public const string Adult = "ADT";
    public const string Child = "CHD";
    public const string Infant = "INF";
  }

  //Old v5
  public class AgeCode
  {
    public const string Adult = "ADT";
    public const string Child = "CLD";
    public const string Infant = "INF";
  }

  //Output of the below is "CLD"
  var code = global::Gateways.API.AgeCode.Child

情况与此示例类似: http://www.davidarno.org/c-howtos/aliases-overcoming-name-conflicts-part-2-extern-alias/

但是在我的情况下,两个类都有变量'Pi'。

:编辑:

我尝试将const declerations更改为'static readonly'但没有成功。

根据要求(在所有情况下我都将API的名称更改为'API'):

<Reference Include="Gateways.API.5, Version=5.0.30922, Culture=neutral, PublicKeyToken=111111111, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>..\Libs\Gateways.API\5\Gateways.API.dll</HintPath>
  <Aliases>ApiV5</Aliases>
</Reference>
<Reference Include="Gateways.API.6, Version=6.0.31238, Culture=neutral, PublicKeyToken=222222222, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>..\Libs\Gateways.API\6\Gateways.API.dll</HintPath>
  <Private>False</Private>
</Reference>

2 个答案:

答案 0 :(得分:1)

我认为问题在于Visual Studio / MSBuild使用与类模式匹配的第一个引用值,因此这意味着您将获取第一个引用的库(即库的第5版)。

我认为如果您向新库添加别名ApiV6,就像您已经为旧库添加了类似的别名,并使用using using ApiV6::Gateways.API.AgeCode来使用AgeCode的新库副本1}}。

答案 1 :(得分:1)

实际解决方案与我在说明中省略的内容有关。

解决方案中有3个项目:

  • Api连接器库
  • 业务逻辑库
  • 网站

我正在更新api连接器库中的常量并将dll直接复制到网站,但似乎我需要使用新的连接器库dll重新编译业务逻辑库。