一个 Blazor 组件中的泛型类型参数能被限制吗?

8
在 Blazor 组件中,就像在典型的 C# 类中一样,可以为方法创建一个泛型参数。语法如下:
@typeparam T

但我想知道如何像在C#类中一样约束它。例如:

// pseudocode
@typeparam T : ICloneable 

例如,我需要创建以下组件,允许开发人员传递一个泛型类型的“Model”: .../GESD.Blazor/Shared/GesdTrForm.razor
@typeparam modelType

<EditForm Model="@Model" 
    OnValidSubmit="@OnValidSubmit"
    style="display:table-row"
>
    @ChildContent
</EditForm>

@code {

    [Parameter]
    public RenderFragment ChildContent { get; set; }

    [Parameter]
    public modelType Model { get; set; } // here is the use of the generic

    [Parameter]
    public EventCallback<EditContext> OnValidSubmit { get; set; }

    void demo () {
        var cloned = Model.Clone();
    }

}

但在.Clone()处我遇到了以下错误:

'modelType'不包含名称为'Clone'的定义...


我知道这是这个问题的重复。然而,我认为那个问题没有很多细节,而且我对编辑它的任何想法几乎都让我完全重写它。如果我越线了,当然可以投票将我的标记为那个问题的重复,但我认为另一个问题存在问题。 - pwilcox
2个回答

17

未来的搜索者们,我刚刚发现这个特性在.NET 6中是可用的

使用方法如下:

@typeparam T where T : IMyInterface

如果编译器无法确定泛型类型,则可以明确指定:

<MyComponent T=MyType>

1

'.../GESD.Blazor/Shared/GesdTrForm.razor' 在命名空间 'GESD.Blazor.Shared' 下创建了一个名为 'GesdTrForm' 的部分类。由于它是一个部分类,您可以创建一个 .cs 文件,将该类声明为部分类,并将约束放在其中。

.../GESD.Blazor/Shared/GesdTrForm.cs

using System;

namespace GESD.Blazor.Shared {

    public partial class GesdTrForm<modelType> where modelType : ICloneable {}

}

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