使用模型的泛型方法

本文关键字:泛型方法 模型 | 更新日期: 2023-09-27 18:32:59

我的数据库中有日志,用于查看产品的分类。对于每个日志系统,批准分类的方法都是相同的,尽管它们存在于我的数据库中的不同表中。为了简化一些事情,我决定创建一个通用方法,例如:

[NonAction]
public void Approve<Log>(Log log, string userId) where Log : ProductLog, CategoryLog, SubCategoryLog
{
    log.approved = true;
    log.approvedBy = userId;
}

其中ProductLog,CategoryLog,SubCategoryLog是我 Asp.Net MVC项目中的模型。

问题是,我收到以下错误:

类类型约束"CategoryLog"必须位于任何其他约束之前

我收到子类别日志的相同错误

请注意,ProductLog、SubCategoryLog 和 CategoryLog 首先是从实体框架数据库生成的类。

有人可以帮我吗?

使用模型的泛型方法

泛型约束只能包含一个类类型约束。它们是"和",而不是"或"。所以这个:

where Log : ProductLog, CategoryLog, SubCategoryLog

被解释为三个类类型约束,这不受支持,因为 C# 没有多重继承。不能有继承这三种类型的类型。

现在你说:

我正在使用数据库优先

因此,我假设这三种类型具有您希望在此泛型方法中设置的相同属性。通过引入接口并将其应用于这些实体的分部类,可以同时解决这两个问题:

public interface ILog
{
    bool approved { get; set; }
    string approvedBy { get; set; }
}
public partial class ProductLog : ILog
{
}
public partial class CategoryLog : ILog
{
}
public partial class SubCategoryLog : ILog
{
}

现在,您可以将泛型方法限制为该接口:

public void Approve<TLog>(TLog log, string userId) where TLog : ILog

如@pseudoDust所示,在这种情况下,您甚至不再需要泛型,只需要接口:

public void Approve(ILog log, string userId)
{
    // ...
}