首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扩展Newtonsoft.Json.Linq.JObject类

扩展Newtonsoft.Json.Linq.JObject类
EN

Stack Overflow用户
提问于 2017-03-15 01:10:55
回答 1查看 720关注 0票数 0

我想扩展Newtonsoft.Json.Linq.JObject类,以获得快速访问(以属性的形式)到从JObject的内容中动态生成的一些表达式。让我们调用扩展类JRecord

我还需要JObject实例可以很容易地转换到扩展类型JRecord。问题是:我如何将JObject实例转换为我的扩展类型(扩展类型也是从JObject继承的),在某种程度上它保留了所有内容,但是当从JObject缩小到JRecord时,这些属性的“修饰”变得“修饰”了,而当从JRecord扩展回JObject时,这些属性的“条带”化了。

下面是我的第一次抓取,我省略了大部分属性,因为它的字符串构建非常复杂,与问题无关,这在两个自定义CType()运算符上都会引发,其中.NET告诉我

  1. 转换运算符不能从类型转换为基类型。
  2. 转换运算符不能从基类型转换。

那我该怎么办?我是否应该创建一个裸露的新实例,并从我想要转换的对象中创建具有相同内容的子实例?

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-15 21:27:57

在这种情况下,我不会使用继承和转换运算符。相反,我会在这里用作文。换句话说,让JRecord类包装原始的JObject并根据需要委托给它。若要从JObject转换为JRecord,请使JRecord的构造函数接受JObject。相反,只需在JObject上创建一个JRecord属性,并让它直接返回内部JObject

代码语言:javascript
复制
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

然后你可以做这样的事情:

代码语言:javascript
复制
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的其他地方,则可以这样做:

代码语言:javascript
复制
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内置的复制构造函数来实现这一点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42799446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档