VB.net匿名类型在AJAX调用中具有不正确的属性大小写

VB.net匿名类型在AJAX调用中具有不正确的属性大小写,ajax,json,vb.net,Ajax,Json,Vb.net,我们注意到,有时从对控制器操作的AJAX调用的结果来看,JSON结果的情况是不正确的。如果我们重新构建解决方案并尝试完全相同的调用,则返回的案例实际上会发生变化。在下面的例子中,密钥的情况已经正确了一年多,直到现在,它决定根据一些看似随机的情况开始随机更改 如上图所示,JSON结果的键是小写的“success”。然而,当我在Chrome的控制台中查看结果时,它是大写的“Success”。这导致我们的JavaScript失败,因为它正在检查小写版本 这是什么原因造成的?更重要的是,我们如何阻止这

我们注意到,有时从对控制器操作的AJAX调用的结果来看,JSON结果的情况是不正确的。如果我们重新构建解决方案并尝试完全相同的调用,则返回的案例实际上会发生变化。在下面的例子中,密钥的情况已经正确了一年多,直到现在,它决定根据一些看似随机的情况开始随机更改

如上图所示,JSON结果的键是小写的“success”。然而,当我在Chrome的控制台中查看结果时,它是大写的“Success”。这导致我们的JavaScript失败,因为它正在检查小写版本

这是什么原因造成的?更重要的是,我们如何阻止这种情况?

vb.net
不区分大小写,而
C>区分大小写。这意味着编译器将仅为以下每个匿名类型生成一个类(来自第一个实例):

Dim a = New With {.success = True} 'Compiler generate a class based on this type
Dim b = New With {.Success = True} 'Same type as `a`
Dim c = New With {.sUcCeSs = True} 'Same type as `a`

Debug.WriteLine(a.GetType().Name)
Debug.WriteLine(b.GetType().Name)
Debug.WriteLine(c.GetType().Name)
VB$AnonymousType_0'1
VB$AnonymousType_0'1
VB$AnonymousType_0'1

下面是编译回vb.net时编译的代码的样子:

<DebuggerDisplay("success={success}"), CompilerGenerated> _
Friend NotInheritable Class VB$AnonymousType_0(Of T0)
    ' Methods
    <DebuggerNonUserCode> _
    Public Sub New(ByVal success As T0)
        Me.$success = success
    End Sub

    <DebuggerNonUserCode> _
    Public Overrides Function ToString() As String
        Dim builder As New StringBuilder
        builder.Append("{ ")
        builder.AppendFormat("{0} = {1} ", "success", Me.$success)
        builder.Append("}")
        Return builder.ToString
    End Function

    Public Property success As T0
        <DebuggerNonUserCode> _
        Get
            Return Me.$success
        End Get
        <DebuggerNonUserCode> _
        Set(ByVal Value As T0)
            Me.$success = Value
        End Set
    End Property

    Private $success As T0

End Class
_
Friend NotInheritable类VB$AnonymousType_0(属于T0)
"方法",
_
公共子新建(ByVal成功作为T0)
我。$success=成功
端接头
_
Public将函数ToString()重写为字符串
Dim builder作为新的StringBuilder
builder.Append(“{”)
AppendFormat(“{0}={1}”,“success”,Me.$success)
builder.Append(“}”)
Return builder.ToString
端函数
公共财产作为T0的成功
_
得到
还给我。$成功
结束
_
设置(ByVal值为T0)
我。$成功=价值
端集
端属性
私人$success作为T0
末级

您是否在任何地方都有使用
.Success
而不是
.Success
的匿名类型?是的,只是因为我们在过去遇到过这个问题,我们试图解决它。但即便如此,它也会改变钥匙的情况。我能想到的唯一一件事是,编译器正在优化它们,使它们成为相同的匿名类型,并且无论哪个先编译的文件都会“获胜”(我在过去看到过这样的情况,在VB项目中名称空间的大小写错误,这意味着构建的名称空间是不确定的,这在出现C#client库时就暴露了出来)是的,我们在某个地方找到了一些文章,说这是VB特有的,在C#中不会发生,但我们从未找到具体的证据。不幸的是,我们的主要项目是在VB中,但解决方案的其余部分是在C#中。您是否考虑过反映编译后的代码,看看这两个实例是否编译为同一类型?Fascinating!你知道有什么方法可以迫使编译器每次都一致地选择一种解释吗?恐怕没有“治愈”的方法。要么确保正确的大小写,要么切换到C#)。不幸的是,这个VB庞然大物中包含了相当多的业务逻辑。同时,我们将抛弃匿名类型,并为此使用适当的类。C#迁移在待办事项列表上:)