Wlb*_*thy 4 c# asp.net-core blazor blazor-server-side .net-5
我创建了一个 TestComponent.razor
@typeparam TValue
@code {
private TValue Type { get; set; }
[Parameter] public string String { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在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";
}
Run Code Online (Sandbox Code Playgroud)
我无法Type myType进入TValue,除非我制作myType当前@typeparam页面
为什么会发生这种情况?有没有办法将变量传递到组件中@typeparam?
您无法使用 \xe2\x80\x9cvariable\xe2\x80\x9d 泛型类型参数创建 Blazor 组件。就像 C# 中的普通泛型类型一样,这些类型参数需要在编译时已知,因此您必须在创建组件时直接指定类型。
\n在你的情况下,这可能看起来像这样:
\n<SampleComponent TValue="string" Type="some string" String="@myString" />\nRun Code Online (Sandbox Code Playgroud)\nTValue由于您已使用property 的泛型类型参数Type,因此您还可以TValue="string"显式省略并让编译器为您完成:
<SampleComponent Type="some string" String="@myString" />\nRun Code Online (Sandbox Code Playgroud)\n如果您想动态创建一个组件,那么您可以动态创建一个RenderFragment呈现该组件的组件。那样
在运行时创建具有动态类型参数的通用组件的唯一方法是使用反射。您可以创建RenderFragment一个动态创建组件:
<div>\n @SampleComponentInstance\n</div>\n\n@code{\n RenderFragment SampleComponentInstance => builder =>\n {\n var type = typeof(SampleComponent<>).MakeGenericType(new[] { MyType });\n builder.OpenComponent(1, type);\n builder.AddAttribute(2, "String", MyString);\n builder.CloseComponent();\n };\n\n Type MyType { get; set; } = typeof(string);\n string MyString { get; set; } = "hello";\n}\nRun Code Online (Sandbox Code Playgroud)\n这将在 div 内SampleComponent使用泛型类型参数来呈现 。MyType
| 归档时间: |
|
| 查看次数: |
5076 次 |
| 最近记录: |