5

我正在使用网络 API。我有点懒,决定从我的控制器返回一个值元组。

[HttpGet]
[Route(AuthAPIRoutes.GET_MFA_DEVICES)]
public (string Type, string Value)[] GetMultiFactoryMethods()
{
    return GlobalFactory<IPaystreamMFASecurityService>.Instance.GetMultiFactorMethods();
}

JSON 响应似乎没有使用适当的命名,这是被优化了吗?

{
    "item1": "Phone",
    "item2": "1-512-555-0550"
}

注意:我知道我可以明确地制作一个模型来避免这个问题。我想了解正在发生的事情,为什么我的值元组名称在响应中没有得到尊重?

4

1 回答 1

6

正在发生的是,ValueTuple作为一种类型(实际上是一组泛型类型)实际上是非常静态的,并且具有命名为Item1,Item2等的属性。

您可以从 C# 中获得良好的语法,您可以在其中声明名称并在代码的其他地方使用它,这只是 C# 语言的一个特性。按名称引用这些值的编译代码最终会调用这些静态属性(Item1例如)。事实上,您仍然可以在您自己的 C# 代码中通过它们的“项目”名称访问这些属性。

从编译代码的角度来看,关于这些元组上的字段名称的唯一线索是与方法关联的属性,因此除非 ASP.NET 将有关操作方法的上下文信息传递给序列化程序,否则将无法序列化程序知道这些属性应该有什么名称。

请参阅这篇文章,深入了解 ValueTuples 在幕后所做的工作。

于 2019-06-17T19:32:48.227 回答