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



使用泛型类型参数作为变量的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);

我可以在代码中完成所有这些,但不能在razor中!!我做了什么不一样/错了?

例如, Person以

下面的字符串开始
Type? typeArgument = Type.GetType("Person");
Type genericClass = typeof(QueryRow<>);
Type constructedClass = genericClass.MakeGenericType(typeArgument);
object? createdType = Activator.CreateInstance(constructedClass);

工作得很好,但后来我不得不使用blazor的动态组件作为一个解决方案来做渲染,我宁愿避免,因为它看起来有点恶心

不能这样使用变量作为类型参数。

你可以使用一点反射来创建一个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的新组件中。

见源代码和指南。

相关内容

  • 没有找到相关文章

最新更新