2017-08-10 2 views
0

je une méthode comme ça:C# passer par générique en tant que paramètre

private Contact GetContactFromDbReaderWithSingleResult(DbDataReader dbReader) 
{ 
    if (dbReader.HasRows) 
    { 
     return new DataReaderReflection().DataReaderToEntity<Contact>(dbReader)[0]; 
    } 

    return null; 
} 

et alors je pourrais avoir une méthode assez similaire comme ça:

private Email GetEmailFromDbReaderWithSingleResult(DbDataReader dbReader) 
{ 
    if (dbReader.HasRows) 
    { 
     return new DataReaderReflection().DataReaderToEntity<Email>(dbReader)[0]; 
    } 

    return null; 
} 

La signature du DataReaderToEntity-Méthode est : Maintenant, je veux créer une variante générique GetGenericEntityFromDbReaderWithSingleResullt.

Mon approche ressemble à ça, mais il corrige pas:

private object? GetEntityFromDbReaderWithSingleResult<T>(DbDataReader dbReader) 
{ 
    if (dbReader.HasRows) 
    { 
     return new DataReaderReflection().DataReaderToEntity<typeof(T)>(dbReader)[0]; 
    } 

    return null; 
} 

En apprentissage pour faire face aux génériques mais ... Qu'est-ce que je fais mal?

Merci d'avance!

+0

Il est '.DataReaderToEntity ()' ' – Rabban

+0

DataReaderToEntity ' 'devrait juste être DataReaderToEntity '? – DavidG

+2

Et les méthodes return-type devraient probablement être juste 'T', pas' object? '. – HimBromBeere

Répondre

4

Changez votre type de retour à T au lieu de l'objet et de supprimer le typeof:

private T GetEntityFromDbReaderWithSingleResult<T>(DbDataReader dbReader) where T : new() 
{ 
    if (dbReader.HasRows) 
    { 
     return new DataReaderReflection().DataReaderToEntity<T>(dbReader)[0]; 
    } 

    return default(T); 
} 
+0

Vous ne pouvez pas retourner 'null' lorsque le type de retour est' T' ... –

+0

Avez-vous mis à jour pour retourner le défaut par défaut pour le type T. –

+0

@HimBromBeere T pourrait être un type de valeur qui ne serait pas Nullable. –