C# Blazor:如何在代码后台中使用@typeparam?(含解决方法)

29

在Blazor的.razor文件中,您可以使用@typeparam MyType来使用泛型参数。例如:

MyComponent.razor

@typeparam MyType

<SomeHtml />

@code
{
    [Parameter]
    public List<MyType> MyList{ get; set; }
}

所以您可以调用:

<MyComponent MyType="MyTypeABC" MyList="@MyData.MyList" />

但我更喜欢后端代码(razor.cs),如何在razor.cs文件中为类型使用参数,例如@typeparam MyType

我目前的解决方法是:

MyComponent.razor

@inherits MyComponentCode<MyType>
@typeparam MyType

MyComponent.razor.cs

public class MyComponentCode<MyType> : ComponentBase
{
    [Parameter]
    public List<MyType> MyList{ get; set; }
}

我想要类似于 [TypeParameter] 的东西,不过或许有更好的解决方案,有任何想法吗?或者也许这是关于如何在代码中使用 Razor @ 语句的一般性问题。


2020-02-27 的更新:

根据 Roger Wolf 的建议(见下文),有一个稍微好一点的方法:

MyComponent.razor

@typeparam MyType

MyComponent.razor.cs

public partial class MyComponent<MyType>
{
    [Parameter]
    public List<MyType> MyList{ get; set; }
}

调用

<MyComponent MyType="MyTypeABC" />
1个回答

24
你的猜测差不多了,只需要在类定义中加入partial即可:
using Microsoft.AspNetCore.Components;

namespace BlazorApp1.Components
{
    public partial class MyCustomComponent<T> : ComponentBase
    {
        [Parameter]
        public string Label { get; set; }
    }
}

The Razor part:

@namespace BlazorApp1.Components
@typeparam T

<label>@($"{Label}. Provided type is {typeof(T).Name.ToUpper()}")</label>

使用方法(Index.razor):
@page "/"
@using BlazorApp1.Components

<MyCustomComponent T="long" Label="Custom component label" />

这样,您就不需要将组件从中继承出来,因为它们都成为同一类的一部分。

2
谢谢,这不完全是我想要的(在.cs文件中的typeparam),但是是的,partial class MyComponent@inherits MyComponent更好。在这种情况下,您还可以删除ComponentBase的继承(: ComponentBase),因为组件本身已经是ComponentBase;),这意味着您仍然可以使用诸如protected override void OnInitialized()之类的方法。 - StewieG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接