C# вызов метода для объекта generi c через действие / делегат (пример kotlin) - PullRequest
0 голосов
/ 12 марта 2020

Я хотел бы вызывать вызовы метода для объекта c в C#. Не могу понять, как я это сделаю. Я опубликую пример kotlin, как я это сделал для шаблона MVP в нашем приложении android.

Базовая презентация generi c Реализация:

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!!)
    }
}

Может ли это быть сделано в C# так же, как в kotlin? Все, что мне нужно, - это иметь возможность выполнять следующий вызов в конкретной реализации презентатора,

onView { doSomeRendering(800, 400) }

, чтобы я мог сохранять частный вид своего представления в BasePresenter и не предоставлять его конкретной реализации.

1 Ответ

0 голосов
/ 12 марта 2020

Итак, я понял, как это сделать. Следующий код предназначен для C#:

Базовая реализация презентатора:

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

Вызов из конкретной реализации презентатора:

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

И поэтому представление больше не нужно быть защищенным в базовом презентере и может быть приватным.

...