请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于顶层扩展函数/属性的Receiver问题

打扰正处于百忙之中的benny老师了,若能抽出时间看看学生的小问题不胜感激

最近在尝试使用kotlin反射编写框架,需要通过反射获取顶层扩展属性的setter。反射得出KMutableProperty的setter,需要接收两个receiver和一个value。对于一个扩展属性而言,我这边明白其中一个receiver是扩展的类的实例。但是,我不知道如何获取第二个receiver(有考虑顶层变量是对应java中的“SampleClassName”Kt,但依然不知道如何在kotlin中获取),以及两个receiver在setter中对应参数的顺序应该是如何。因此总结为如下两个问题:

  1. 如何获取顶层扩展函数/属性的两个receiver?
  2. 扩展属性的setter中,两个receiver的参数顺序如何?

相关代码如下:

  1. KMutableProperty中set的相关定义:
    /**
     * Modifies the value of the property.
     *
     * @param receiver1 the instance of the first receiver.
     * @param receiver2 the instance of the second receiver.
     * @param value the new value to be assigned to this property.
     */
    public actual fun set(receiver1: D, receiver2: E, value: R)
  1. 项目中相关代码:
   private fun setValueByProperty(view: V, value: T): Boolean {
        return view::class.memberExtensionProperties.find {
            it.name == propertyOrFunctionName
        }?.let {
            it as KMutableProperty2
        }?.run {
            //两个null即两个receiver,
            //其中一个扩展的receiver可以传入
            //而另一个作为顶层属性的receiver不知道如何获取
            setter.call(null, null, value)
            true
        }?:false
    }

正在回答 回答被采纳积分+3

2回答

bennyhuo 2019-02-27 23:00:25

你是给某一个类定义了一个扩展属性,然后要反射修改?这个需求也是很奇怪的样子。反射的 memberExtensionProperties 是指定义在该类当中的扩展属性,并不是该类的扩展属性,因此如果你在 X 当中定义了 Y 的扩展属性,要用 X::class.memberExtensionProperties,receiver 的顺序应该就是这二者的书序,你试试就可以了,不行就反过来~

至于顶层的扩展方法,应该是没有可以获取列表的。

0 回复 有任何疑惑可以回复我~
  • 提问者 二階堂夢月 #1
    是这样的,我在ExtPropertity.kt中定义了一个顶层属性,代码如下:
    package com.yumetsuki.ktmvvm.core.ext
    
    import android.view.View
    import com.yumetsuki.ktmvvm.core.ext.delegate.OnClickDelegate
    
    
    
    var View.onClick by OnClickDelegate<Unit, (View) -> Unit>()
    
    我现在想通过反射,来对该属性进行修改。如老师所说的例子,X中定义了Y,X的一个实例即为该属性的一个receiver。但是,由于它被定义为顶层属性,我不知道该如何获取这个X(即receiver)
    回复 有任何疑惑可以回复我~ 2019-02-28 00:27:24
  • bennyhuo 回复 提问者 二階堂夢月 #2
    那就没有呗,传null试试
    回复 有任何疑惑可以回复我~ 2019-02-28 05:37:22
  • 提问者 二階堂夢月 回复 bennyhuo #3
    我又去尝试了一下,貌似反射没有办法获取到顶层属性,我换了个思路在object单例中定义所需的扩展属性,再通过反射修改就没有问题了。setter中的两个receiver,第一个是定义该属性的类的实例,第二个是被扩展的类的实例。
    
    谢谢benny老师~
    回复 有任何疑惑可以回复我~ 2019-02-28 12:13:35
bennyhuo 2019-02-27 22:51:36

什么鬼。。看的我一头雾水,你发个完整的源码上来看看。。

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信