2017-10-19 96 views
6

Próbuję przypisać static List<PropertyInfo> wszystkich właściwości DbSet w klasie Entities.Linq .Where (type = typeof (xxx)) porównanie jest zawsze fałszywe

Jednak po uruchomieniu kodu Lista jest pusta, ponieważ .Where(x => x.PropertyType == typeof(DbSet))zawsze zwraca wartość false.

Próbowałem wiele odmian w metodzie .Where(...), takich jak typeof(DbSet<>), Equals(...), .UnderlyingSystemType, itp., Ale żaden nie działa.

Dlaczego w moim przypadku .Where(...) zawsze zwraca wartość false?

Mój kod:

public partial class Entities : DbContext 
{ 
    //constructor is omitted 

    public static List<PropertyInfo> info = typeof(Entities).getProperties().Where(x => x.PropertyType == typeof(DbSet)).ToList(); 

    public virtual DbSet<NotRelevant> NotRelevant { get; set; } 
    //further DbSet<XXXX> properties are omitted.... 
} 
+3

'DbSet'! =' DbSet '... Powiedziałbym, że to jest problem –

+0

@ClaudioRedi Tak, to był problem. Czy istnieją zasoby online, w których mogę odczytać różnice? – Tom

Odpowiedz

7

Od DbSet jest oddzielny typ, należy użyć bardziej specyficzne podejście:

bool IsDbSet(Type t) { 
    if (!t.IsGenericType) { 
     return false; 
    } 
    return typeof(DbSet<>) == t.GetGenericTypeDefinition(); 
} 

Teraz Twój klauzula Where będzie wyglądać następująco:

.Where(x => IsDbSet(x.PropertyType)) 
+0

Typo w kodzie: 'Type.GetGenericTypeDefinition' nie przyjmuje żadnych argumentów. – pinkfloydx33

+0

@ pinkfloydx33 Masz rację, dziękuję bardzo! Możesz edytować kod, zwłaszcza gdy widzisz głupie błędy w ten sposób. – dasblinkenlight