从工厂动态渲染 blazor 组件

时间:2021-03-18 10:38:41

标签: c# blazor blazor-webassembly

我有一个 IList<IControl>,它是一个派生自 IComponent 的接口,接口的每个实现都继承自 ComponentBase。该组件是从工厂动态实例化的(它返回一个与输入类型兼容的组件)。

现在我想渲染这个列表,但我不知道如何,这是我的 ControlsContainer.razor:

@foreach (var control in OrderedControls)
{
    <div @key=@Guid.NewGuid().ToString()>

        @RenderWidget(control)

    </div>
}

我想避免每个组件类型都使用 switch/if-else if(它们是通过反射动态加载的,我不需要在某处注册它们)。

1 个答案:

答案 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;
    }
}
相关问题