2016-10-12 2 views
1

Есть ли способ написать следующий код на C#?Как передать общий тип C# другому классу

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

Это дает мне следующее сообщение об ошибке:

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'

DbSet является Microsoft.EntityFrameworkCore.DbSet.

Как это исправить?

ответ

7

Попробуйте 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 есть. Вы можете предоставить эту гарантию, применив одно и то же ограничение к своему собственному методу, который говорит компилятору оставить вас в покое и выпустить это загадочное сообщение об ошибке у ваших абонентов.

+0

И почему это необходимо? – FrozenHeart

+1

@FrozenHeart В этом случае, вероятно, потому, что 'DbSet ' имеет такое же ограничение на свой собственный параметр типа 'T'. –

+2

@FrozenHeart Да, я только что проверил, и у него такое же ограничение. 'где TEntity: class' –

1

Добавить ограничение в ваш метод

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

И зачем это требуется? – FrozenHeart

+0

Добавляя к замечанию Эда выше, ограничение ограничения на класс означает, что метод разрешает только ссылочный тип, который требуется в этом случае. См. Также: http://stackoverflow.com/a/38483145/2779990 –

Смежные вопросы