2013-05-10 15 views
7

mam API przy użyciu metody rodzajowe jak postępowaćPrzełęcz konkretny typ obiektu jako parametr do metody rodzajowe

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

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

Moja aplikacja zawiera klasy wygenerowane przy użyciu CodeDOM w czasie wykonywania, a także w celu śledzić stworzyłem interfejs o nazwie IDataObject. Staram się przekazać konkretny typ każdego obiektu do metody rodzajowe powyżej następująco:

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

dataObject zawiera instancję klasy, które dziedziczą z IDataObject. Jestem zainteresowany uzyskaniem tego typu i przekazać go jako T. Próbuję dowiedzieć się, czy jest możliwe, aby użyć tutaj dynamic. typeof() i GetType() nie działa jak stwierdzono w Here

+1

Istnieje kilka sztuczek, które wykorzystują dynamikę jako pomost między refleksją a rodzajami, ale wymagają instancji. Jeśli nie masz instancji, MakeGenericMethod jest Twoim głównym narzędziem. Lub nietypowy API ... –

+0

@MarcGravell: 'dataObject' jest instancją zawierającą informacje o typach, które próbuję wyodrębnić i przekazać. Spójrz na odpowiedź Jona –

Odpowiedz

15

Podejrzewam chcesz coś takiego:

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

który wykorzystuje dataObject dynamicznie, coraz „kompilator wykonanie-time” do wykonywania rodzaj wnioskowania wypracowania T .

Możesz może wystarczy użyć odbicia, aby zrobić to sam, używając MethodInfo.MakeGenericMethod - ale ten sposób jest z pewnością mniej kodu.

+0

Dokładnie tego szukam Dzięki! –

+0

Wywołanie w pierwszej metodzie powinno być 'return PurgeDataObjectImpl ((dynamic) dataObject, uid);' (zła nazwa metody, mniej niż 6 znaków, nie mogę edytować) –

+0

@MoslemBenDhaou: Doh, tak, rzeczywiście - naprawiony, dziękuję . –

Powiązane problemy