代码之家  ›  专栏  ›  技术社区  ›  eidylon

这里怎么了?我搞不懂…ToJSON扩展方法

  •  1
  • eidylon  · 技术社区  · 14 年前

    给出以下声明:

    <Extension()> Public Function ToJSON(ByVal target As Object) As String
        Dim serializer = New System.Runtime.Serialization.Json.DataContractJsonSerializer(target.GetType)
        Using ms As MemoryStream = New MemoryStream()
            serializer.WriteObject(ms, target)
            ms.Flush()
    
            Dim bytes As Byte() = ms.ToArray() 
    
            Dim json As String = Encoding.UTF8.GetString(bytes, 0, bytes.Length)
    
            Return json
        End Using
    End Function
    

    以及测试页的页面加载中的以下行:

    Dim kvp = New System.Collections.Generic.KeyValuePair(Of String, Object)(
        "date", New HttpCookie("woot", "yikes")
    )
    Put(New HttpCookie("woot", "yikes").ToJSON)
    Put(kvp.ToJSON)
    Put(kvp.Value.ToJSON)
    Put("here".ToJSON())
    

    第一个Put工作得很完美,并输出以下JSON:

    {"Domain":null,"Expires":"\/Date(-62135578800000-0500)\/",
     "HttpOnly":false,"Name":"woot","Path":"\/",
     "Secure":false,"Value":"yikes"}
    

    然而,第二个推杆抛出了一个巨大而丑陋的错误:

    '类型'System.Web.HttpCookie“具有数据协定名称”HttpCookie: http://schemas.datacontract.org/2004/07/System.Web

    第三个Put也会抛出一个错误,但完全不同:

    找不到类型“HttpCookie”的公共成员“ToJSON”。

    我很困惑,为什么当第一行工作时,扩展方法显然是在HttpCookie对象上找到的,为什么在第二和第三个Puts中它不工作,为什么我在这两种情况下得到不同的错误?前三个put中的每一个都在尝试做同样的事情——调用HttpCookie对象上的ToJSON扩展方法。

    欢迎光临!

    1 回复  |  直到 14 年前
        1
  •  2
  •   Community CDub    7 年前

    第三个问题 Put VB不支持任何声明为类型的扩展方法 Object : VB.NET: impossible to use Extension method on System.Object instance

    这将起作用: Put(ToJSON(kvp.Value))

    这也会:

    Dim kvp = New System.Collections.Generic.KeyValuePair(Of String, HttpCookie)( 
        "date", New HttpCookie("woot", "yikes")) 
    Put(kvp.Value.ToJSON)