我想扩展Newtonsoft.Json.Linq.JObject类,以获得快速访问(以属性的形式)到从JObject的内容中动态生成的一些表达式。让我们调用扩展类JRecord。
我还需要JObject实例可以很容易地转换到扩展类型JRecord。问题是:我如何将JObject实例转换为我的扩展类型(扩展类型也是从JObject继承的),在某种程度上它保留了所有内容,但是当从JObject缩小到JRecord时,这些属性的“修饰”变得“修饰”了,而当从JRecord扩展回JObject时,这些属性的“条带”化了。
下面是我的第一次抓取,我省略了大部分属性,因为它的字符串构建非常复杂,与问题无关,这在两个自定义CType()运算符上都会引发,其中.NET告诉我
那我该怎么办?我是否应该创建一个裸露的新实例,并从我想要转换的对象中创建具有相同内容的子实例?
Public Class JRecord
Inherits JObject
Public Sub New()
MyClass.New
End Sub
Public ReadOnly Property Id As Integer
Get
Return MyBase.Value(Of Integer)("id")
End Get
End Property
Public ReadOnly Property NomeSigla As String
Get
Return String.Format(
"{0} ({1})",
MyBase.Value(Of String)("nome"),
MyBase.Value(Of String)("sigla"))
End Get
End Property
Public Overloads Shared Narrowing Operator CType(json_object As JObject) As JRecord
Return DirectCast(json_object, JRecord)
End Operator
Public Overloads Shared Widening Operator CType(json_record As JRecord) As JObject
Return json_record
End Operator
End Class发布于 2017-03-15 21:27:57
在这种情况下,我不会使用继承和转换运算符。相反,我会在这里用作文。换句话说,让JRecord类包装原始的JObject并根据需要委托给它。若要从JObject转换为JRecord,请使JRecord的构造函数接受JObject。相反,只需在JObject上创建一个JRecord属性,并让它直接返回内部JObject。
Public Class JRecord
Private innerJObject As JObject
Public Sub New(jObject As JObject)
innerJObject = jObject
End Sub
Public ReadOnly Property JObject As JObject
Get
Return innerJObject
End Get
End Property
Public ReadOnly Property Id As Integer
Get
Return innerJObject.Value(Of Integer)("id")
End Get
End Property
Public ReadOnly Property NomeSigla As String
Get
Return String.Format(
"{0} ({1})",
innerJObject.Value(Of String)("nome"),
innerJObject.Value(Of String)("sigla"))
End Get
End Property
End Class然后你可以做这样的事情:
Dim jr as JRecord = new JRecord(JObject.Parse(jsonString))
Dim id as Integer = jr.Id
Dim ns as String = jr.NomeSigla
Dim jo as JObject = jr.JObject
...如果您绝对必须使用继承,因为您希望直接将JRecord传递到应用程序中只期望有一个JObject的其他地方,则可以这样做:
Public Class JRecord
Inherits JObject
Public Sub New(jObject As JObject)
MyBase.New(jObject)
End Sub
Public ReadOnly Property JObject As JObject
Get
Return Me
End Get
End Property
Public ReadOnly Property Id As Integer
Get
Return Value(Of Integer)("id")
End Get
End Property
Public ReadOnly Property NomeSigla As String
Get
Return String.Format(
"{0} ({1})",
Value(Of String)("nome"),
Value(Of String)("sigla"))
End Get
End Property
End Class这几乎是一回事,除了现在JRecord是一个JObject,所以您可以自由地传递它。权衡之处在于,现在它必须在第一次构造JRecord时复制所有属性。我们利用JObject内置的复制构造函数来实现这一点。
https://stackoverflow.com/questions/42799446
复制相似问题