如何在 blazor 中将变量传递到组件的 @typeparam

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

pok*_*oke 8

您无法使用 \xe2\x80\x9cvariable\xe2\x80\x9d 泛型类型参数创建 Blazor 组件。就像 C# 中的普通泛型类型一样,这些类型参数需要在编译时已知,因此您必须在创建组件时直接指定类型。

\n

在你的情况下,这可能看起来像这样:

\n
<SampleComponent TValue="string" Type="some string" String="@myString" />\n
Run Code Online (Sandbox Code Playgroud)\n

TValue由于您已使用property 的泛型类型参数Type,因此您还可以TValue="string"显式省略并让编译器为您完成:

\n
<SampleComponent Type="some string" String="@myString" />\n
Run Code Online (Sandbox Code Playgroud)\n
\n

如果您想动态创建一个组件,那么您可以动态创建一个RenderFragment呈现该组件的组件。那样

\n

在运行时创建具有动态类型参数的通用组件的唯一方法是使用反射。您可以创建RenderFragment一个动态创建组件:

\n
<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}\n
Run Code Online (Sandbox Code Playgroud)\n

这将在 div 内SampleComponent使用泛型类型参数来呈现 。MyType

\n