FrozenHeart FrozenHeart - 8 days ago 4x
C# Question

How to pass C# generic type to another class

Is there any way to write the following code in C#?

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

It gives me the following error:

Error CS0452 The type 'T' must be a reference type in order to use it
as parameter 'TEntity' in the generic type or method 'DbSet'

is the

How can I fix it?


Try a generic type constraint. class in this context will constrain T to be a reference type. Callers won't be able to call GetRandomRecord<DateTime>(dbSet), because DateTime is a struct. This will be enforced by the compiler.

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

This is required because DBSet<TEntity> has the same constraint:

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

So the compiler won't let you do what you're doing until you can guarantee that you will respect that constraint that DbSet has. You provide that guarantee by applying the same constraint to your own method, which passes it along to your callers.