我有自定义组件,其中有多个事件,每个事件都有唯一的
T type
。然后 JSInvokable
方法是常见的方法(入口点),我需要从这里调用确切的事件功能处理程序。
这样做时,我需要将参数和函数处理程序转换为适当的类型。但由于类型转换问题,我使用了动态类型。
但是即使传递了正确的参数类型,我在运行时也遇到了以下问题。
请检查抛出的错误截图:
比较剃须刀
@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>
转换的问题?还有其他解决办法吗?
更改:
get { return (EventCallback<ChangeEventArgs>)this.GetEvent("change"); }
致:
get { return (EventCallback<ChangeEventArgs>)(object) this.GetEvent("change"); }
也许现在你不需要使用动态...
祝你好运...