鉴于以下声明:
<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
测试页的Page_Load中的以下行:
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"}
然而,第二个Put会抛出一个巨大而丑陋的错误:
不期望输入数据合约名称为“HttpCookie:http://schemas.datacontract.org/2004/07/System.Web”的'System.Web.HttpCookie'。考虑使用DataContractResolver或将任何静态未知的类型添加到已知类型列表中 - 例如,使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。
第三个Put也会抛出错误,但完全不同:
未找到类型'HttpCookie'上的公共成员'ToJSON'。
第四次Put非常完美。
我很困惑为什么,当第一行工作,并且在HttpCookie对象上明显找到Extension方法时,为什么然后在第二和第三个Puts中它不起作用,为什么我会得到一个不同的错误两种情况?前三个Puts中的每一个都试图做同样的事情 - 在HttpCookie对象上调用ToJSON扩展方法。
欢迎所有博览会!
答案 0 :(得分:2)
第三个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)