function - Kotlin 使用数据类发送函数参数

标签 function kotlin arguments parameter-passing data-class

假设我有课:

class Foo {
   fun doSomething(param1: Int, param2: String, param3: String) 
}

和一个数据类

data class Params(
   val param1: Int,
   val param2: String,
   val param3: String)

现在我想使用数据类参数将它们发送给函数,有没有办法做到这一点?让我们说类似的话:

val myParams = Params(1, "2", "3")
val foo = Foo()
foo.doSomething(myparams)

或者通过某种转换或方法命名。作为:

 execute(foo, foo::doSomething, myParams)

最佳答案

我怀疑在没有一些技巧的情况下,这在 Kotlin 中是可能的。可能的解决方案是反射 API 和代码生成。

使用反射的例子:

fun main() {
    val myParams = Params(1, "2", "3")
    val foo = Foo()

    invokeWithParams(foo::doSomething, myParams)
}

fun <T : Any, R> invokeWithParams(func: KFunction<R>, params: T): R {
    val paramValues = func.parameters.map { kparam ->
        (params::class as KClass<T>)
            .memberProperties
            .single { it.name == kparam.name }
            .get(params)
    }.toTypedArray()
    return func.call(*paramValues)
}

它应该适用于静态函数、成员函数和扩展函数。它可能会在一些罕见的情况下失败。您可能应该添加一些错误处理,例如检查参数是否匹配。

它不会在 JVM 以外的任何其他目标上工作,因为反射在其他目标上仍然非常有限。

此外,对于这种不安全的转换,我并不完全确定。我认为它不会失败,但我对此不是 100% 确定。

更新:

我们可以通过将函数转换为扩展 operator invoke 让它变得更有趣:

operator fun <T : Any, R> KFunction<R>.invoke(params: T): R

然后我们可以像这样将它与任何函数一起使用:

(foo::doSomething)(myParams)

我不确定这是否是个好主意,因为它比显式调用效用函数更令人困惑。

关于function - Kotlin 使用数据类发送函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69532915/

相关文章:

android - Kotlin Flow 和 Websockets 在 Android 上具有干净的架构

java - 如何将上下文作为参数传递

java - 日期程序的验证问题

javascript - 发布/订阅模式中的参数如何工作?

将代码从 'hard-coding' 转换为 'soft-coding'

javascript - 将额外参数传递给回调函数

javascript - 注入(inject)不纯函数与调用它有何不同?

android - 为多个 View 设置动画会导致动画卡住

c++ - 如何将变量从 C++ 中的一个函数返回到 main,然后在另一个函数中使用它?

c++ - Vim Ctags 如何自动完成函数参数?