Blazor有一个名为EventCallback的通用类
如何投射
protected EventCallback<T> ValueChanged { get; set; }
到
EventCallback<bool> BoolChanged
{
get
{
if (typeof(T) == typeof(bool))
return ValueChanged; //<== Error needs cast some how?
}
}
答案 0 :(得分:1)
@Steven,以下代码可以代表并阐明您的问题吗?
假设我具有以下组件
@*Parent.razor*@
@page "/Parent"
<div>
<Child Data="@Data" ValueChanged="@ValueChanged">
</Child>
</div>
@functions {
List<Item> Data = new List<Item>();
private void ValueChanged(Item item)
{
}
}
@*Child.razor*@
@typeparam TData
<div>
@foreach (var item in Data)
{
<button onclick="@(() => ValueChanged.InvokeAsync(item))"></button>
}
</div>
@functions {
[Parameter]
public IEnumerable<TData> Data { get; set; }
[Parameter]
protected EventCallback<TData> ValueChanged { get; set; }
}
// Item.cs
public class Item
{
public Item()
{
}
}
如您所见,我有两个组件,并且正在使用泛型(typeparam) 与EventCallback ...现在,我想定义EventCallback属性 与get访问器一起检查TData的类型是否为bool,以及是否 确实如此,将ValueChanged委托隐藏到EventCallback
EventCallback<bool> BoolChanged {
get
{
if (typeof(TData) == typeof(bool)) return ValueChanged; // Needs conversion, but how
}
}
答案 1 :(得分:0)
您尝试过
(EventCallback<bool>)ValueChanged;
在这种情况下,请确保ValueChanged
的类型为EventCallback<bool>
。
答案 2 :(得分:0)
感谢Twitter上的Levi Broderick提供答案。
protected EventCallback<bool> BoolChanged => (EventCallback<bool>)(object)ValueChanged;
他指出:弹跳转换对象基本上是C#惯用语,因为“我知道编译器无法在编译时对此进行推理,但是无论如何在运行时都可以尝试,而且我接受可能会发生异常。” >