首页 > 解决方案 > 从工厂动态渲染 Blazor 组件

问题描述

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

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

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

        @RenderWidget(control)

    </div>
}

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

标签: c#blazorblazor-webassembly

解决方案


未经测试,但以下应该可以工作,或者至少让你走上正确的道路......

@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;
    }
}

推荐阅读