如果使用KCallable
创建Any()::toString
,则稍后引用时,您无需传递Any
实例(使用call
时)。
虽然如果它是使用Any::toString
创建的(不是Any
的实例),则需要传递Any
实例。
所以我的问题是如何轻松找出是否需要传递该实例参数并且此参数是否必需?
我找到了一种方法:
callable.parameters[0].kind == KParameter.Kind.INSTANCE
但它不是很好,我想知道是否有一种更简单或推荐的解决方法。谢谢!
答案 0 :(得分:1)
您建议的方法的改进是检查instanceParameter
属性:如果它不为null,则callable需要一个实例:
val isInstanceCallable = callable.instanceParameter != null
此外,fun Any.foo() = ...
等扩展功能在instanceParameter
中将为空,您可能也想检查extensionReceiverParameter
。
此外,如果您只需要使用可调用引用,则可以检查它们是否具有绑定接收器(即它绑定的实例)。使用boundReceiver
属性:
val instance = (callable as CallableReference).boundReceiver
当可调用引用未绑定时,它将返回特殊值CallableReference.NO_RECEIVER
,因此您只需要将返回值与它进行比较:
val bound = (callable as CallableReference).boundReceiver != CallableReference.NO_RECEIVER