3

我正在尝试创建一个具有 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 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 种泛型类型的情况。我也阅读了文档 ,但无法用它来解决我的问题。

4

3 回答 3

2

只是发现这个问题是关于 blazor不支持类型约束的。

@juharr 问我是否在其他地方使用它。我说不,但实际上我在 blazor 组件中使用它,它还没有那种支持;/

于 2020-03-18T16:38:24.880 回答
0

使您的通用组件仅成为类组件。这样你就可以添加你的约束

于 2020-03-19T15:11:51.410 回答
0

我认为值得分享我发现的解决方法 - 只需将代码隐藏文件添加到您的组件并在那里指定约束。

这个答案的功劳使我取得了成功......

将约束添加到的步骤MyComponent.razor

  1. 添加 -> 新建 -> 类,命名文件 MyComponent.razor.cs确保它与. 如果一切正常,该文件应添加为子文件或...MyComponent.razorMyComponent.razor.cs

  2. 打开MyComponent.razor.cs. 确保命名空间与组件相同(如果在同一文件夹中创建类应该可以)

  3. 将课程标记为public partial并添加您的约束

    // 确保命名空间匹配 public partial class MyComponent where TItem : MyBaseClass, new() {

就是这样。更好的是,我现在可以将通用服务注入到我的MyComponent.razor组件中:

@typeparam TItem

@inject MyGenericService<TItem> _genericService;

请注意,我将服务注册Startup.cs为单例(没有测试范围但应该也可以)......

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

希望这对其他人有用,它使我的通用 CRUD 表单更容易处理,并节省了大量重复代码和奇怪的开关来从通用控件推断类型!

于 2020-09-13T14:41:29.213 回答