[C#通过操作/委托调用通用对象的方法(kotlin示例)

问题描述 投票:-1回答:1

我想在C#中对通用对象调用方法调用。似乎无法弄清楚我该怎么做。我将在我们的Android应用中发布一个Kotlin示例,说明如何针对MVP模式执行此操作。

基本演示者通用实现:

interface IBasePresenter<in T> {
    fun takeView(view: T)
    fun dropView()
}

class BasePresenter<T> : IBasePresenter<T> {
    private var view: T? = null

    final override fun takeView(view: T) {
        this.view = view
    }

    final override fun dropView() {
        view = null
    }

    fun onView(action: T.() -> Unit) {
        if (view != null) {
            action.invoke(view!!) // Magic :-)
        }
    }
}

执行MVP的简单合同:

interface IMyView {
    fun doSomeRendering(int width, int height)
}

interface IMyPresenter : IBasePresenter<IMyView> {
    fun onButtonClicked()
}

视图和演示者的实现:

class MyView : Fragment(), IMyView {
    ....

    override fun doSomeRendering(int width, int height) {
        // Do some rendering with width and height...
    }

    ....
}

class MyPresenter : BasePresenter<IMyView> {
    override fun onButtonClicked() {
        // onView action block is context aware of IMyView functions...
        onView { doSomeRendering(800, 400) } // Magic :-)
    }
}

除了以下内容外,我还用C#进行了所有设置:

fun onView(action: T.() -> Unit) {
    if (view != null) {
        action.invoke(view!!)
    }
}

可以像在kotlin中那样在C#中完成此操作吗?我需要的是能够在具体的演示者实现中执行以下调用,

onView { doSomeRendering(800, 400) }

这样,我可以在BasePresenter中将我的视图设为私有,而不将其公开给具体的实现。

c# generics kotlin action
1个回答
0
投票

所以我想出了怎么做。以下代码适用于C#:

基本演示者实现:

void OnView(Action<TView> action) => action(_view)

从具体演示者实现中调用:

OnView(view => view.DoSomeRendering(800, 400))

因此视图不再需要在基本演示者中保护,而可以是私有的。

© www.soinside.com 2019 - 2024. All rights reserved.