使用模型的泛型方法
本文关键字:泛型方法 模型 | 更新日期: 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)
{
// ...
}