我想在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#:
基本演示者实现:
void OnView(Action<TView> action) => action(_view)
从具体演示者实现中调用:
OnView(view => view.DoSomeRendering(800, 400))
因此视图不再需要在基本演示者中保护,而可以是私有的。