c# - 如何将变量传递到 blazor 中组件的 @typeparam
问题描述
我创建了一个 TestComponent.razor
@typeparam TValue
@code {
private TValue Type { get; set; }
[Parameter] public string String { get; set; }
}
在 index.razor 页面中,我有以下内容:
@page "/"
<h1>Hello, world!</h1>
Welcome to your new app.
<SurveyPrompt Title="How is Blazor working for you?" />
<ComponentFactory.Data.SampleComponent TValue="@myType" String="@myString"></ComponentFactory.Data.SampleComponent>
@code{
Type myType { get; set; } = typeof(string);
string myString { get; set; } = "hello";
}
我不能Type myType
进入TValue
,除非我对当前页面做myType
一个@typeparam
为什么会发生这种情况,有没有办法将变量传递给组件@typeparam
?
解决方案
不能使用“变量”泛型类型参数创建 Blazor 组件。就像 C# 中的普通泛型类型一样,这些类型参数需要在编译时知道,因此您必须在创建组件时直接指定类型。
在您的情况下,这可能如下所示:
<SampleComponent TValue="string" Type="some string" String="@myString" />
由于您已经TValue
为 property使用了泛型类型参数,因此Type
您也可以TValue="string"
显式省略并让编译器为您完成该参数:
<SampleComponent Type="some string" String="@myString" />
如果您想动态创建一个组件,那么您可以做的是动态创建一个RenderFragment
呈现该组件的组件。那样
在运行时创建具有动态类型参数的通用组件的唯一方法是使用反射。您可以创建一个RenderFragment
动态创建组件:
<div>
@SampleComponentInstance
</div>
@code{
RenderFragment SampleComponentInstance => builder =>
{
var type = typeof(SampleComponent<>).MakeGenericType(new[] { MyType });
builder.OpenComponent(1, type);
builder.AddAttribute(2, "String", MyString);
builder.CloseComponent();
};
Type MyType { get; set; } = typeof(string);
string MyString { get; set; } = "hello";
}
这将使用div 内SampleComponent
的泛型类型参数呈现 。MyType
推荐阅读
- c# - 声明方法变量时有没有办法使用条件?
- javascript - 如何防止在浏览器控制台中使用 firebase.database()?
- laravel - REST 邮递员请求
- html - Internet Explorer 11 设计问题
- node.js - 无法识别根路由
- kubernetes - 无法使用自定义域访问入口网关
- javascript - Flask 的 AJAX 请求 CORS 策略错误
- python - FastAPI (starlette) 获取客户端真实IP
- graphql - 如何访问解析器中的查询路径属性?GraphQL
- jquery - 基于 [data-counter] 隐藏 div