2013-05-10 7 views
7

Ich habe eine API generische Methode wie folgtPass konkrete Objekttyp als Parameter für generische Methode

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

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

Meine Anwendung enthält Klassen generiert CodeDOM zur Laufzeit mit und um den Überblick zu behalten ich eine Schnittstelle geschaffen genannt IDataObject. Ich versuche, den konkreten Typ jedes Objekts zu dem allgemeinen Verfahren, das oben wie folgt zu übergeben:

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

dataObject enthält eine Instanz einer Klasse, die von IDataObject erben. Ich interessiere mich dafür, diesen Typ zu bekommen und es als T zu übergeben. Ich versuche herauszufinden, ob es irgendwie möglich ist, dynamic hier zu verwenden. typeof() und GetType() funktioniert nicht wie in Here

+1

Es gibt einige Tricks, um dynamisch als Brücke zwischen Reflexion und Generika zu verwenden, aber sie benötigen eine Instanz. Wenn Sie keine Instanz haben, ist MakeGenericMethod Ihr Hauptwerkzeug. Oder eine nicht-generische API ... –

+0

@MarcGravell: 'dataObject' ist eine Instanz, die Typinformationen enthält, die ich extrahieren und weitergeben möchte. Werfen Sie einen Blick auf Jon Antwort –

Antwort

15

erklärte ich vermute, dass Sie so etwas wie dies wollen:

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()); 
} 

Das dataObject dynamisch verwendet, die „execution-time-Compiler“ getting Typinferenz auszuführen T zu erarbeiten .

Sie könnte nur Reflexion verwenden, um dies selbst zu tun, mit MethodInfo.MakeGenericMethod - aber dieser Weg ist sicherlich weniger Code.

+0

Das ist genau das, was ich suche Danke! –

+0

Der Aufruf in der ersten Methode sollte 'return PurgeDataObjectImpl ((dynamisches) dataObject, uid);' (falscher Methodenname, weniger als 6 Zeichen, kann ich nicht bearbeiten) –

+0

@MoslemBenDhaou: Doh, ja tatsächlich - behoben, danke . –

Verwandte Themen