我在我的数据库中登录以查看产品分类。批准分类的方法对于每个日志系统都是相同的,尽管它们存在于我的数据库中的不同表中。为了简化一些事情,我决定创建一个通用方法,例如:
[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项目中的模型。
问题是,我收到以下错误:
班级类型约束&#39; CategoryLog&#39;必须在任何其他约束之前出现
我为SubCategoryLog
得到了同样的错误请注意,ProductLog,SubCategoryLog和CategoryLog是从Entity Framework Database First生成的类。
有人可以帮帮我吗?
答案 0 :(得分:3)
通用约束可以包含一个类类型约束。它们是“和”,而不是“或”。所以这个:
where Log : ProductLog, CategoryLog, SubCategoryLog
被解释为三类类型约束,这是不受支持的,因为C#没有多重继承。 不能具有继承这三种类型的类型。
现在你说:
我正在使用Database First
所以我假设这三种类型具有您希望在此泛型方法中设置的相同属性。通过引入接口并将其应用于这些实体的部分类,可以立即解决这两个问题:
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)
{
// ...
}