使用模型的通用方法

时间:2016-02-03 13:56:15

标签: c# generics

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

[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生成的类。

有人可以帮帮我吗?

1 个答案:

答案 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)
{
    // ...
}