如何将EventCallback <t>转换为EventCallback <bool>

时间:2019-05-26 08:46:06

标签: c# events blazor

Blazor有一个名为EventCallback的通用类

如何投射

protected EventCallback<T> ValueChanged { get; set; }

EventCallback<bool> BoolChanged
   {
     get
     {
       if (typeof(T) == typeof(bool))
         return ValueChanged; //<== Error needs cast some how?
     }
   }

3 个答案:

答案 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#惯用语,因为“我知道编译器无法在编译时对此进行推理,但是无论如何在运行时都可以尝试,而且我接受可能会发生异常。”