如何将C#泛型类型传递给另一个类

时间:2016-10-12 15:59:35

标签: c# generics

有没有办法在C#中编写以下代码?

public T GetRandomRecord<T>(DbSet<T> set)
{
    return set.OrderBy(r => Guid.NewGuid()).FirstOrDefault();
}

它给了我以下错误:

  

错误CS0452类型“T”必须是引用类型才能使用它   作为泛型类型或方法'DbSet'

中的参数'TEntity'

DbSetMicrosoft.EntityFrameworkCore.DbSet

我该如何解决?

2 个答案:

答案 0 :(得分:8)

尝试generic type constraint。在此上下文中,class会将T限制为引用类型。呼叫者无法呼叫GetRandomRecord<DateTime>(dbSet),因为DateTime是一个结构。这将由编译器强制执行。

public T GetRandomRecord<T>(DbSet<T> set) where T : class
{
    // ... stuff
}

这是必需的,因为DBSet<TEntity>具有相同的约束:

public class DbSet<TEntity> 
    : DbQuery<TEntity>, 
      IDbSet<TEntity>, 
      IQueryable<TEntity>, 
      IEnumerable<TEntity>, 
      IQueryable, 
      IEnumerable 
      where TEntity : class
    //  M... O... U... S... EEEEE....
{

所以编译器不会让你做你正在做的事情,直到你可以保证你会尊重DbSet所具有的约束。你可以通过对你自己的方法应用相同的约束来提供这种保证,这会告诉编译器让你独自一人,而是在你的调用者身上喷出那个神秘的错误消息。

答案 1 :(得分:1)

为方法添加约束

public T GetRandomRecord<T>(DbSet<T> set) where T : class