繁体   English   中英

通用 Razor 类型参数作为变量传递

[英]Generic Razor Type Parameter pass as variable

使用通用类型参数作为变量的 Razor/Blazor 组件

 <QueryRow  Titem="Person"/>

作品

在上述组件中,我可以接收参数

 Type typeParameterType = typeof(Titem);

并创建一个实例

 object? myObject = Activator.CreateInstance(typeParameterType);

然而,这一切都很好

  public Type mytype = typeof(Person);

  <QueryRow  Titem="@mytype"/>

不起作用,我需要能够将类型从父级作为类型或字符串列表向下传递,我可以使用反射将其转换为真实类型。

如何将类型参数作为变量传递,例如

mytype = typeof(Person);

我可以用代码做所有这些,但不能用剃须刀!!! 我在做什么不同/错误?

例如, Person 以下面的字符串开头

   Type? typeArgument = Type.GetType("Person");
   Type genericClass = typeof(QueryRow<>);
   Type constructedClass = genericClass.MakeGenericType(typeArgument);
   object? createdType = Activator.CreateInstance(constructedClass);

效果很好,但是我必须使用 blazor 的 Dynamic 组件作为解决方法来进行渲染,我宁愿避免这样做,因为它看起来有点 yuk

您不能以这种方式将变量用作类型参数。

您可以使用一点反射来创建 RenderFragment:

public Type myType = typeof(Person);

@MakeQueryComponent(myType)

@code {
    RenderFragment MakeQueryComponent(Type typeParam)
    {
        var genericType = typeof(QueryRow<>)
            .MakeGenericType(new[] { typeParam });

        RenderFragment frag = new RenderFragment(b =>
        {
            b.OpenComponent(1, genericType);
            b.CloseComponent();
        });

        return frag;
    }
}

更新

GitHub 问题 26781之后,Blazor 团队现在已将上述生成 RenderFragment 的方法封装到一个名为 DynamicComponent 的新组件中。

请参阅源代码指南

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM