【发布时间】:2021-04-21 05:50:26
【问题描述】:
我有 Item 实现 IItem 和 ItemContainer 实现 IItemContainer。
在ItemContainer.razor我有以下,将自己传递给它的所有@ChildContent:
<CascadingValue Value="this">
@ChildContent
</CascadingValue>
@code{
List<IItem> Items;
void AddItem(IItem item) => Items.Add(item);
.
.
.
}
在Item 类中,我有以下内容:
[CascadingParameter] public IItemContainer ItemContainer {get;set;}
protected override void OnInitialized()
{
ItemContainer.AddItem(this);
}
RenderFragment RenderStuff => Do some rendering stuff with ItemContainer
.
.
.
假设我有以下内容:
<ItemContainer>
<Item>
<Item>
<Item>
</ItemContainer>
我希望当第一个<Item> 调用它的OnInitialized 时,
<ItemContainer> 已经将自身传递给 [CascadingParameter] public IItemContainer ItemContainer {get;set;},
所以[CascadingParameter] public IItemContainer ItemContainer {get;set;} 不会为空,
并且ItemContainer.AddItem(this); 将被成功调用并将<Item> 添加到<ItemContainer> 的List<IItem> Items。
如果我使用具体的类,例如 ItemContainer 而不是 IItemContainer for <CascadingValue Value="this">,这不是问题。
但是,当<CascadingValue Value="this"> 的this 是接口而不是具体类时,不会自动进行强制转换,并且会抛出空异常(ItemContainer 未传递到级联参数中)。
当我尝试使用<CascadingValue TValue="IItemContainer" Value="(IItemContainer)this"> 进行强制转换时,会抛出异常。
我想将接口而不是具体类传递给级联参数。有没有办法让这个工作?
【问题讨论】:
标签: c# asp.net-core interface refactoring blazor