【问题标题】:How to pass a variable into a component's @typeparam in blazor如何将变量传递到 blazor 中组件的 @typeparam
【发布时间】:2021-04-05 05:54:40
【问题描述】:

我已经创建了一个 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

【问题讨论】:

  • 描述你想要实现的目标可能会更好,因为你当然可以通过制作一个接受类型的参数将类型传递给组件,但我们不知道是什么你想做是因为你已经决定如何去做“它”,发现那个方法不起作用,只是问如何让那个方法起作用,它不会。说明您希望您的组件能够做什么,并且有人将能够提供帮助

标签: c# asp.net-core blazor blazor-server-side .net-5


【解决方案1】:

您不能使用“变量”泛型类型参数创建 Blazor 组件。就像 C# 中的普通泛型类型一样,这些类型参数需要在编译时知道,因此您必须在创建组件时直接指定类型。

在您的情况下,可能如下所示:

<SampleComponent TValue="string" Type="some string" String="@myString" />

由于您已将泛型类型参数 TValue 用于属性 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 内呈现带有泛型类型参数 MyTypeSampleComponent

【讨论】:

  • 您好,使用反射来创建具有动态类型的通用组件正是我想要实现的。我试过喂 TValue="@typeof(TItem).GetProperty(PropertyName).PropertyType" 但它会抛出错误。
  • @Wlbjtsthy 我已经通过一个关于如何动态创建组件的示例扩展了我的答案。
  • 谢谢!有用。但它仅在只有一个 @typeparam 时才有效。 var type = typeof(SampleComponent).MakeGenericType(new[] { MyType, MySecondType });返回一个错误,指出 SampleComponent 需要两个参数。有没有办法让它适用于多个参数?
  • 原来我需要这样做:typeof(SampleComponent).MakeGenericType(MyType, MySecondType);
猜你喜欢
  • 2022-01-05
  • 1970-01-01
  • 2021-10-27
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
  • 2019-05-04
相关资源
最近更新 更多