这有什么不对?我很困惑...... ToJSON扩展方法

时间:2010-08-21 04:14:43

标签: vb.net extension-methods

鉴于以下声明:

<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扩展方法。

欢迎所有博览会!

1 个答案:

答案 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)