2013-05-10 14 views
7

Ho un'API utilizzando il metodo generico come seguirePass Tipo di oggetto concreto come parametro per il metodo generico

public static class DataProvider 
{ 
    public static Boolean DeleteDataObject<T>(Guid uid, IDbConnection dbConnection) 
    { 
     // Do something here 
    } 

    public static IDbConnection GetConnection() 
    { 
     // Get connection 
    } 
} 

La mia applicazione contiene classi generate utilizzando CodeDOM in fase di esecuzione, e al fine di tenere traccia di Ho creato un'interfaccia denominata IDataObject. Sto cercando di passare il tipo concreto di ogni oggetto al metodo generico di cui sopra come segue:

public static Boolean PurgeDataObject(this IDataObject dataObject, Guid uid) 
{ 
    return DataProvider.DeleteDataObject<T>(uid, DataProvider.GetConnection()); 
} 

dataObject contiene un'istanza di una classe che eredita da IDataObject. Sono interessato a ottenere quel tipo e passarlo come T. Sto cercando di scoprire se è possibile in qualche modo utilizzare dynamic qui. typeof() e GetType() non funziona come indicato nel Here

+1

Ci sono alcuni trucchi per utilizzare la dinamica come ponte tra riflessione e generici, ma richiedono un'istanza. Se non si dispone di un'istanza, MakeGenericMethod è lo strumento principale. O un'API non generica ... –

+0

@MarcGravell: 'dataObject' è un'istanza che contiene le informazioni sul tipo che sto cercando di estrarre e trasmettere. Dai un'occhiata alla risposta di Jon –

risposta

15

Ho il sospetto che si desidera qualcosa di simile:

public static Boolean PurgeDataObject(this IDataObject dataObject, Guid uid) 
{ 
    return PurgeDataObjectImpl((dynamic) dataObject, uid); 
} 

private static Boolean PurgeDataObjectImpl<T>(T dataObject, Guid uid) 
    where T : IDataObject 
{ 
    return DataProvider.DeleteDataObject<T>(uid, DataProvider.GetConnection()); 
} 

che utilizza dataObject dinamicamente, ricevendo il "tempo di esecuzione del compilatore" per eseguire l'inferenza di tipo a lavorare fuori T .

È è possibile utilizzare la riflessione per farlo da soli, ma in questo modo è sicuramente meno codice.

+0

Questo è esattamente quello che sto cercando Grazie! –

+0

La chiamata nel primo metodo dovrebbe essere 'return PurgeDataObjectImpl ((dynamic) dataObject, uid);' (nome metodo errato, meno di 6 caratteri, non posso modificare) –

+0

@MoslemBenDhaou: Doh, sì sì - risolto, grazie . –

Problemi correlati