静态扩展如何在 Blazor 中用于 js 互操作?

问题描述

我已经设法让代码变得如此平静。

Blazor html:

@inject IJSRuntime js
<button @onclick="Delete">Delete</button>

函数删除():

private async Task Delete()
    {
        var confirmed = await js.Confirm($"Are you sure you want to delete?");
    }

静态扩展:

    public static class IJSRuntimeExtensionMethods
    {
        public static async ValueTask<bool> Confirm(this IJSRuntime js,string message)
        {
            return await js.InvokeAsync<bool>("confirm",message);
        }
    }

代码使 javascript 确认弹出。

我的问题是它是如何工作的?

最令人困惑的部分是:

var confirmed = await js.Confirm($"Are you sure you want to delete?");

为什么我们只能写Confirm,而不能写IJSRuntimeExtensionMethodsInstance.Confirm

为什么我们还需要在这个位js.

它是如何通过 js.Confirm($"Are you sure you want to delete?") 传递到静态扩展名的,或者 js 之后的点符号到底在做什么?

解决方法

扩展方法是一种语言特性,它允许您扩展任何类或接口的行为。基本上,这只是简化对静态方法的调用并使其看起来像对实例方法的调用的语法糖。

在扩展方法的声明中,请注意 var today = new Date(); var time = today.getHours(); var dayName = today.getDay(); var date1 = new Date(); date1.setDate(date1.getDate() + 1); var date2 = new Date(); date2.setDate(date2.getDate() + 2); //Cuma günü if (dayName == 5 && time >= 15) { alert("As of 15:00 on Fridays,registration for that day cannot be made."); } //Hafta içi if (dayName == 1 && time >= 14) { alert("Registration is not possible for that day as of 14:00.") } 之前的 this。这意味着该方法扩展 IJSRuntime js 类型:

IJSRuntime

在幕后调用

public static async ValueTask<bool> Confirm(this IJSRuntime js,string message)

被翻译成

js.Confirm("text");

你也可以这样调用方法!