【问题标题】:EventCallback<dynamic> throws RuntimeBinderExceptionEventCallback<dynamic> 抛出 RuntimeBinderException
【发布时间】:2019-10-25 21:38:11
【问题描述】:

使用我修改了计数器的默认模板:

@code {
    private int currentCount = 0;

    private async void IncrementCount()
    {
        currentCount++;

        await UpdateCallback.InvokeAsync(new { Counter = currentCount });
    }

    [Parameter] public EventCallback<dynamic> UpdateCallback { get; set; }
}

我是这样使用它的:

<Counter UpdateCallback="(d)=>MyCallback(d,42)"></Counter>

@code {

    public void MyCallback(dynamic val, int number)
    {

    }
}

这导致

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: '无法将类型'void'隐式转换为'object''

如果我传递一个 Tuple&lt;dynamic&gt; 它会起作用。

这是为什么呢?

【问题讨论】:

    标签: c# blazor blazor-server-side blazor-client-side


    【解决方案1】:

    您使用 InvokeAsync 进行了调用,因此它需要一个返回不为 void 的任务的方法。在您使用 Counter 组件的地方使用它,我认为这将解决您的问题。

    <Counter UpdateCallback="async (d)=> await MyCallback(d,42)"></Counter>
    
    @code {
    
        public async Task MyCallback(dynamic val, int number)
        {
    
        }
    }
    

    【讨论】:

    • 谢谢,但你能解释一下为什么它在传递元组时会起作用吗? public void MyCallback(Tuple val, int number) 也返回 void 而不是 Task。
    • 我认为原因是动态类型,它是一种特殊类型,您可以使用其他类型,而不仅仅是 Tuple 可以正常工作。我正在测试一下,使用 工作正常。我认为在为 UpdateCallback 封装函数时出现问题。
    猜你喜欢
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 2019-11-19
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    • 2013-08-26
    相关资源
    最近更新 更多