创建通用扩展方法时出现问题

时间:2014-10-10 20:38:32

标签: c# generics

现在我正在尝试创建一个在我的存储库中包含外键的通用方法。

我目前得到的是:

public static class ExtensionMethods
{
    private static IQueryable<T> IncludeProperties<T>(this DbSet<T> set, params Expression<Func<T, object>>[] includeProperties)
    {
        IQueryable<T> queryable = set;
        foreach (var includeProperty in includeProperties)
        {
            queryable = queryable.Include(includeProperty);
        }

        return queryable;
    }
}

但是在编译时我得到错误:

  

类型&#39; T&#39;必须是引用类型才能将其用作参数   &#39; TEntity&#39;在泛型类型或方法中   &#39; System.Data.Entity.DbSet&#39;

这可能是什么问题?

2 个答案:

答案 0 :(得分:7)

where T : class附加到方法签名的末尾:

private static IQueryable<T> IncludeProperties<T>(
    this DbSet<T> set,
    params Expression<Func<T, object>>[] includeProperties)
    where T : class // <== add this constraint.
{
    ...
}

DbSet<TEntity>有此约束,因此为了使T类型参数与TEntity兼容,它必须具有相同的约束。

答案 1 :(得分:0)

如错误消息所述,DbSet的泛型参数必须是引用类型。您的泛型参数可以是任何内容,包括非引用类型。您需要将其约束为引用类型。