C# 使用模型的通用方法

C# 使用模型的通用方法,c#,generics,C#,Generics,我的数据库中有日志,用于查看产品分类。批准分类的方法对于每个日志系统都是相同的,尽管它们存在于数据库中的不同表中。为了简化一些,我决定创建一个通用方法,例如: [NonAction] public void Approve<Log>(Log log, string userId) where Log : ProductLog, CategoryLog, SubCategoryLog { log.approved = true; log.approvedBy = use

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

[NonAction]
public void Approve<Log>(Log log, string userId) where Log : ProductLog, CategoryLog, SubCategoryLog
{
    log.approved = true;
    log.approvedBy = userId;
}
[非动作]
public void Approve(日志日志,字符串userId),其中日志:ProductLog,CategoryLog,SubCategoryLog
{
log.approved=true;
log.approvedBy=userId;
}
其中ProductLog、CategoryLog和SubCategoryLog是我的Asp.NETMVC项目中的模型

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

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

我对Subcategory Log也有同样的错误

请注意,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
public void Approve(ILog log, string userId)
{
    // ...
}

ProductLog
CategoryLog
SubCategoryLog
是否都继承自公共基类或实现公共接口,例如
ILog
?如果是这样,这应该是您对泛型方法的约束。如果他们没有,那就加一个!你有接口吗<代码>ILog?不,我不知道。你能帮我剪掉密码吗?我在C#手册中读到了关于接口的内容,但我不知道如何使它适应我的问题。此外,我先使用数据库,我不想更改自动生成的模型。如果您不知道如何先修改数据库生成的模型,请参阅。我想我已经成功了!感谢大家的帮助。通过一个界面,可以避免所有的泛型:
public void Approve(ILog log,string userId)