Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 别名常量隐藏全局常量_C# - Fatal编程技术网

C# 别名常量隐藏全局常量

C# 别名常量隐藏全局常量,c#,C#,背景 该解决方案是一个MVC web应用程序,它连接到同一API的两个版本。连接器是类库,其中API的wsdl的相应版本被消费到代理类中。web项目引用两个库(具有相同的命名空间)。较旧、使用较少的版本使用别名,较新的版本使用全局别名,试图减少代码库中别名限定符的数量 问题 尝试访问较新全局引用中的常量字符串时,我会收到较旧别名库的值 //New v6 public class AgeCode { public const string Adult = "ADT";

背景

该解决方案是一个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
情况与此示例类似:

但是在我的例子中,两个类都有变量'Pi'

:编辑:

我曾尝试将常量减容改为“静态只读”,但没有成功

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


假的
..\Libs\Gateways.API\5\Gateways.API.dll
ApiV5
假的
..\Libs\Gateways.API\6\Gateways.API.dll
假的

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


我认为,如果您将
ApiV6
的别名添加到新库中,就像您将类似的别名添加到旧库中一样,并使用using
using ApiV6::Gateways.API.AgeCode
来使用
AgeCode

的新库副本,那么实际的解决方案与我在描述中遗漏的内容有关

解决方案中有3个项目:

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

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

@HenkHolterman发生问题的类中未“使用”别名类(没有“外部别名…”),另一个是“使用Gateways.API”。@WillDud这两个类是在同一个命名空间中还是在不同的命名空间中?@meh uk它们都在同一个命名空间中。我们针对API版本5开发了库,然后他们发布了版本6,我们更新了相同的代码库(在一个分支中)。因为我们将所有内容连接起来,所以在同一个web项目中引用这两个版本相当容易。最困难的部分是\bin中有两个同名的文件(还有这个bug)。您可能会发现像这样的工具可以帮助您解决这类问题:)。很抱歉,测试您的建议花了这么长时间。我尝试了这个方法,在引用的属性中的别名字段中添加了'ApiV6'。然后将“extern alias ApiV6”添加到相关文件的顶部,然后将using更新为“using ApiV6::Gateways.API”。现在,当我在debug中运行应用程序时,我可以将鼠标悬停在'AgeCode'对象上,并且它具有正确的成员(包括'CHD'),但是当我将执行推进到变量赋值之后,变量就会设置为'CLD'。我开始认为这是一个独特的案例,它以前没有出现过,而且被窃听过。有帮助吗?谢谢,但是没有。我已经准备好了一切。问题是在运行时使用了错误的值(尽管调试信息显示正确)。请将源代码签出到新目录并重新生成以确保没有剩余的工件?
<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>