使用泛型类型参数作为变量的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的新组件中。
见源代码和指南。