【问题标题】:C# Type.GetFields different orders based on environment [duplicate]C# Type.GetFields 基于环境的不同顺序[重复]
【发布时间】:2020-09-17 21:12:57
【问题描述】:

假设你有一个像下面这样的枚举:

namespace MyApp
{
    public enum Colors
    {
        Red = 0,
        Blue = 1,
        Green = 2,
        Yellow = 3
    }
}

你想把枚举作为一个数组来检索,所以你使用这个函数来获取所有的信息,然后将它发送回前端。

Type.GetFields(BindingFlags.Public | BindingFlags.Static)

类型是我的枚举颜色。现在在我的本地环境中,我按照声明的顺序获取值。每次我刷新页面时,枚举数组的顺序都是一样的,没有变化。

但是,我的应用程序已经部署在另一个环境中,并且在此服务器中每次都以不同的顺序检索数组。这会导致前端错误,但我无法修复在本地环境中实际上看不到的内容。

Type.GetFields 函数是否有不同的行为,我不知道我用于运行项目的 .NET Framework 版本?这是我目前唯一能想到的。

在进行此更改之前,我需要在我的环境中重现此内容。

【问题讨论】:

  • @GSerg 并不特别。因为在进行此更改之前,我需要在本地环境中重现随机排序的数组。在其他环境(客户端)上,阵列是随机排序的。在我的开发环境中,每次的顺序都是一样的。所有环境的相同代码
  • 如果您需要特定订单,请订购。如果您依赖此命令,那么您将忽略文档中的建议。至于为什么顺序不同,可能是优化问题,或者任何其他数量的怪癖..
  • 为此我总是使用Enum.GetNames()。如果我没记错的话,它确实会以 expected 的顺序返回它们。实际上,备注返回值数组的元素是按照枚举常量的二进制值排序的(也就是按照它们的无符号大小)。

标签: c# types enums


【解决方案1】:

来自Type.GetFields() documentation

备注

GetFields 方法不返回特定顺序的字段,例如字母顺序或声明顺序。 您的代码不得依赖于返回字段的顺序,因为该顺序会有所不同。

【讨论】:

  • 我已经看到了,对我来说看起来很简单。但是,为什么在我的开发环境中我得到的订单很好,而在其他环境(客户端)中,每次请求时订单都会改变?
  • @ggderas 既然你看到了,而且你认为它是直截了当的,为什么要问这个问题是直截了当的答案?
  • @Servy 我的问题是关于尝试理解,基于订购的物品而不是订购的物品。因为就像我上面解释的那样,在某些环境中,每次的顺序都是完全相同的,而在其他环境中,每次都是随机的。是什么让某些环境以不同的方式工作?这是我的问题
  • @ggderas 我知道你想了解发生了什么,但我认为你看错了,因为这是一个非常低级的细节,我们作为 .NET 的消费者,不应该明白。通过不只是自己订购集合,您提出的任何解决方法都可能在其他某个时间点停止工作,并且它在一个环境中“有效”但在另一个环境中“有效”的事实证明,如果您的环境可能会再次遇到同样的问题随后因任何原因在未来发生变化。使其具有确定性,问题就会消失。
  • @JohnH 是的,你是对的。我可能需要做那个改变。在进行任何更改之前,我需要证明它不适用于我们的环境,以便我可以报告错误并根据需要进行处理。但是,是的。我可能最终会按照你的建议去做。谢谢
【解决方案2】:

使用Enum.GetNames() 而不是Type.GetFields()

该方法的备注说:

返回值数组的元素按枚举常量的二进制值排序(即按它们的无符号大小)。

在文档中有规定,所以应该是一致的。

【讨论】:

  • 现在我很好奇。也许有人投了我的票,因为标题询问了Type.GetFields。但是,问题的主体开始于“假设您有一个枚举...[并且]您想将枚举作为数组检索”。 OP 要求从枚举中获取信息以一致的方式传递到不同的层。这个答案就是这样做的。哦,好吧。
猜你喜欢
  • 2018-03-29
  • 2015-02-23
  • 1970-01-01
  • 2021-12-20
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多