我有一个 IList<IControl>
,它是一个派生自 IComponent
的接口,接口的每个实现都继承自 ComponentBase
。该组件是从工厂动态实例化的(它返回一个与输入类型兼容的组件)。
现在我想渲染这个列表,但我不知道如何,这是我的 ControlsContainer.razor:
@foreach (var control in OrderedControls)
{
<div @key=@Guid.NewGuid().ToString()>
@RenderWidget(control)
</div>
}
我想避免每个组件类型都使用 switch/if-else if(它们是通过反射动态加载的,我不需要在某处注册它们)。
答案 0 :(得分:1)
未经测试,但以下应该有效,或者至少让您走上正确的道路......
@foreach (var control in OrderedControls)
{
<div @key=@Guid.NewGuid().ToString()>
@RenderWidget(control)
</div>
}
@code {
RenderFragment RenderWidget(IControl control)
{
var concreteType = control.GetType();
RenderFragment frag = new RenderFragment(b =>
{
b.OpenComponent(1, concreteType);
b.CloseComponent();
});
return frag;
}
}