0

我定义了一个名为snackbarOptions的Action 委托,因此我可以在添加snackbar 时使用它,而不是在Snackbar.Add()函数调用中声明它

Action<SnackbarOptions> snackbarOptions = (options) =>
{
            options.RequireInteraction = true;
            options.Action = "UKLONI DUPLIKAT";
            options.ActionColor = Color.Error;
            options.ActionVariant = Variant.Filled;
            options.Onclick = async snackbar =>
            {
                await DeleteDependency(readStep, readDependency);
            };
 };

现在,每当我想添加小吃店时,我只需传递options参数。add 函数本身就是函数的参数。

duplicatesValidation.CheckForDuplicates((x, y, z) => Snackbar.Add("Message", MudBlazor.Severity.Warning, snackbarOptions));

这很好用,但是,当我尝试将snackbarOptions作为函数参数传递时,我可以在CheckForDuplicates()函数中调用Snackbar.Add ,我得到一个对象引用错误

duplicatesValidation.CheckForDuplicates(snackbarOptions);

编辑:所以总结一下: 这有效:

public void CheckForDuplicates(Action<string, Severity, Action<SnackbarOptions>> SnackBarAdd) 
{
...
}

呼唤——

duplicatesValidation.CheckForDuplicates((x, y, z) => Snackbar.Add("Message", MudBlazor.Severity.Warning, snackbarOptions))

这不会:

public bool CheckForDuplicates(Action<SnackbarOptions> options)
{
...
}

呼唤——

duplicatesValidation.CheckForDuplicates(snackbarOptions)

编辑 2: 未处理的异常呈现组件:对象引用未设置为对象的实例。... EditDependenciesDialog.razor.cs:该行的第 188 行代码:duplicatesValidation.CheckForDuplicates(duplicatesSnackbarOptions) DuplicatesValidation.cs:该行的第 35 行代码:Snackbar.Add("x", Severity.Warning, options);

4

1 回答 1

0

考虑使用本地函数来避免丢失对象引用。

当您在运行时创建和存储委托时,您创建的委托可能在您调用它时未被分配。

当使用本地方法时,它是预编译的,可以在其范围内的任何时间和任何地方引用。

void snackbarOptions(Options options)
{
        options.RequireInteraction = true;
        options.Action = "UKLONI DUPLIKAT";
        options.ActionColor = Color.Error;
        options.ActionVariant = Variant.Filled;
        options.Onclick = async snackbar =>
        {
            await DeleteDependency(readStep, readDependency);
        };
 }
于 2021-05-26T07:57:17.780 回答