簡體   English   中英

如何在 Blazor 中創建一個必須從具有泛型類型的類繼承的泛型類型?

[英]How to make a generic type that must inherit from a class with generic type in Blazor?

我正在嘗試創建一個具有 3 個泛型類型的類,其中一個類型必須從具有其他 2 個泛型類型的另一個類繼承。

我真正需要的是IForm繼承自FormComponent因此它有所有實現它的方法。

Form.razor

@typeparam TForm
@typeparam TModel
@typeparam TResult

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

表格.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
}

表單組件.cs

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

    public abstract TResult OnValidSubmit();

    // ... 
    // some other properties   
}

我使用 Form 的地方的代碼

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

但這給了我錯誤

錯誤 CS0314 類型“TForm”不能用作泛型類型或方法“Form<TForm、TModel、TResult>”中的類型參數“TForm”。 沒有從 'TForm' 到 'Core.Web.Base.FormComponent< TModel, TResult >' 的裝箱轉換或類型參數轉換

我在很多地方搜索了這個錯誤,但沒有發現任何有 3 種泛型類型的情況。 我也閱讀了文檔,但無法使用它來解決我的案例。

只是發現這個問題是關於 blazor還不支持類型約束

@juharr 問我是否在其他地方使用它。 我說不,但實際上我在 blazor 組件中使用它,但它還沒有這種支持;/

使您的通用組件僅成為類組件。 這樣你就可以添加你的約束

我認為值得分享我發現的解決方法 - 只需將代碼隱藏文件添加到您的組件並在那里指定約束。

歸功於這個讓我成功的答案......

將約束添加到MyComponent.razor步驟:

  1. 添加 -> 新建 -> 類,將文件命名為MyComponent.razor.cs並確保它與MyComponent.razor同一文件夾中創建。 如果一切正常,則應將該文件添加為子文件或MyComponent.razor.cs ...

  2. 打開MyComponent.razor.cs 確保命名空間與組件相同(如果類是在同一個文件夾中創建的應該沒問題)

  3. 將該類標記為public partial並添加您的約束

    // 確保命名空間匹配公共部分類 MyComponent where TItem : MyBaseClass, new() {

就是這樣。 更好的是,我現在可以將通用服務注入到MyComponent.razor組件中:

@typeparam TItem

@inject MyGenericService<TItem> _genericService;

請注意,我在Startup.cs將該服務注冊為單例(沒有測試范圍,但應該也能正常工作)...

// --- `Startup.cs` code
services.AddSingleton(new MyGenericService<MyObject>());

希望這對其他人有用,它使我的通用 CRUD 表單更容易處理並節省了大量重復代碼和奇怪的開關以從通用控件推斷類型!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM