我是 Blazor webassembly 的新手,对以下内容感到困惑。 我有一个名为Earth.razor
的共享组件
<div>
<button @onclick=@(() =>OnStop.InvokeAsync(DateTime.Now))>
Stop Spinning
</button>
</div>
@code
{
[Parameter]
public EventCallback<DateTime> OnStop { get; set; }
}
我在Index.razor
页面中使用Earth.razor
,如下所示。
@page "/"
The earth stopped spinning at @(dt.ToString("hh:mm:ss")).
<Earth OnStop=StopHandler1 />
<Earth OnStop=StopHandler2 />
@code{
private DateTime dt = DateTime.Now;
private void StopHandler1()
{
this.dt = DateTime.Now;
}
private void StopHandler2(DateTime dt)
{
this.dt = dt;
}
}
在这里OnStop
可以分配EventCallback<DateTime>
类型的事件,也可以分配参数不同的StopHandler1
和StopHandler2
。
问题
为什么可能?
下面的答案不是写在书本等,只是猜测,但我相信它在某种程度上是正确的,如果不是全部的话。但是,这肯定是您问题的正确答案:
EventCallback 不是委托类型,而是根据需要生成委托的结构。
当你对EventCallback<DateTime> OnStop
"委托"使用OnStop=StopHandler1
和OnStop=StopHandler2
时,这两种方法都是可以容忍的,尽管它们的签名不同,因为在后台,系统提供了正确的委托(我不熟悉 Blazor 的内部结构,但在我看来这非常合理(。
如果使用真正的委托(如操作委托(,则对同一委托使用这两种方法将不起作用。如果你做这样的事情:
[Parameter]
public Action<DateTime> OnStop { get; set; }
这:<Earth OnStop=StopHandler1 />
不起作用,因为 StopHandler1 方法的签名不适合此处定义的操作委托。
希望这有帮助...