有没有办法在C#中编写以下代码?
public T GetRandomRecord<T>(DbSet<T> set)
{
return set.OrderBy(r => Guid.NewGuid()).FirstOrDefault();
}
它给了我以下错误:
错误CS0452类型“T”必须是引用类型才能使用它 作为泛型类型或方法'DbSet'
中的参数'TEntity'
DbSet
是Microsoft.EntityFrameworkCore.DbSet
。
我该如何解决?
答案 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