Blazor:使用动态作为 EventCallback 时出现无效参数类型匹配异常<T>

问题描述 投票:0回答:1

我有自定义组件,其中有多个事件,每个事件都有唯一的

T type
。然后
JSInvokable
方法是常见的方法(入口点),我需要从这里调用确切的事件功能处理程序。

这样做时,我需要将参数和函数处理程序转换为适当的类型。但由于类型转换问题,我使用了动态类型。

但是即使传递了正确的参数类型,我在运行时也遇到了以下问题。

请检查抛出的错误截图:

enter image description here

比较剃须刀

@using Typecasting
@using System.Threading.Tasks;
@using Newtonsoft.Json;

@inherits Base;

<input id="gencomp" type="text" />

@code {
    [Parameter]
    public EventCallback<ChangeEventArgs> ValueChange
    {
        get { return (EventCallback<ChangeEventArgs>)this.GetEvent("change"); }
        set { this.SetEvent<ChangeEventArgs>("change", value); }
    }

    [Parameter]
    public EventCallback<FocusOutEventArgs> FocusOut
    {
        get { return (EventCallback<FocusOutEventArgs>)this.GetEvent("blur"); }
        set { this.SetEvent<FocusOutEventArgs>("blur", value); }
    }

    public async Task<string> DummyCall()
    {
        // dummy async action method to show case the issue
        return await Task.Run(() => { return "data"; });
    }

    [JSInvokable]
    // this is entry point
    public override object Trigger(string eventName, string arg)
    {
        EventData data = this.DelegateList[eventName];
        var eventarg = JsonConvert.DeserializeObject(arg, data.ArgumentType);
        dynamic fn = data.Handler;
        // here am getting the issue
        fn.InvokeAsync(eventarg);
        return eventarg;
    }
}

base.cs

public Dictionary<string, EventData> DelegateList = new Dictionary<string, EventData>();
internal virtual void SetEvent<T>(string name, EventCallback<T> eventCallback)
{
    if (this.DelegateList.ContainsKey(name))
    {
        this.DelegateList[name] = new EventData().Set<T>(eventCallback, typeof(T));
    }
    else
    {
        this.DelegateList.Add(name, new EventData().Set<T>(eventCallback, typeof(T)));
    }
}

internal object GetEvent(string name)
{
    if (this.DelegateList.ContainsKey(name) == false)
    {
        return null;
    }
    return this.DelegateList[name].Handler;
}
------

事件数据类

public class EventData
{
    public object Handler { get; set; }

    public Type ArgumentType { get; set; }

    public EventData Set<T>(EventCallback<T> action, Type type)
    {
        this.Handler = action;
        this.ArgumentType = type;
        return this;
    }
}

您可以从 github.com 找到问题重现示例。

这是否是动态类型

eventCallback<T>
转换的问题?还有其他解决办法吗?

c# asp.net-core dynamic blazor
1个回答
1
投票

更改:

get { return (EventCallback<ChangeEventArgs>)this.GetEvent("change"); }

致:

get { return (EventCallback<ChangeEventArgs>)(object) this.GetEvent("change"); }

也许现在你不需要使用动态...

祝你好运...

© www.soinside.com 2019 - 2024. All rights reserved.