Как создать тип generi c, который должен наследоваться от класса с типом generi c в Blazor? - PullRequest
1 голос
/ 18 марта 2020

Я пытаюсь создать класс, который имеет 3 универсальных c типа, и один из типов должен наследовать от этого другого класса, который имеет другие 2 универсальных c типа.

То, что я на самом деле необходимо, чтобы IForm наследовал от FormComponent, поэтому в нем реализованы все его методы.

Form.razor

@typeparam TForm
@typeparam TModel
@typeparam TResult

<EditForm Model="@Model" OnValidSubmit="@HandleValidSubmit">
    @ChildContent
</EditForm>

Form.razor.cs

public partial class Form<TForm, TModel, TResult>  
    where TForm : FormComponent<TModel, TResult>
{

    [Parameter]
    public TForm FormRef { get; set; }

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

    [Parameter]
    public TModel Model { get; set; }

    // ... 
    // some other properties
}

FormComponent.cs

public abstract class FormComponent<TModel, TResult> : BaseDomComponent
{        
    [CascadingParameter]
    public TModel Model { get; set; }

    public abstract TResult OnValidSubmit();

    // ... 
    // some other properties   
}

Код, из которого я использую форму

<Form Model="@Entity" FormRef="@_formRef" OnValidSubmit="@HandleValidSubmit">
    <XYZForm @ref="_formRef" />
    <Button ButtonType="ButtonType.Submit">Submit</Button>
</Form>

Но это дает мне ошибку

Ошибка CS0314 Тип 'TForm 'нельзя использовать в качестве параметра типа' TForm 'в типе c типа generic или методе' Form '. Не существует преобразования в бокс или преобразования параметров типа из 'TForm' в 'Core.Web.Base.FormComponent '

Я искал эту ошибку во многих местах, но не нашел любой случай, когда было 3 типа c. Я также прочитал документы , но не смог использовать это для решения моего дела.

Ответы [ 2 ]

2 голосов
/ 18 марта 2020

Просто узнайте, что проблема в блазоре пока не поддерживается ограничение типа .

@ juharr спросил, не использую ли я его в другом месте. Я сказал нет, но на самом деле я использую его в компоненте Blazor, и у него пока нет такой поддержки; /

0 голосов
/ 19 марта 2020

Сделайте ваш универсальный c компонент только компонентом класса. Таким образом, вы можете добавить свои ограничения

...