2013-05-10 6 views
7

У меня есть API, используя общий метод, как следоватьPass конкретный тип объекта в качестве параметра для универсального метода

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

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

Моя программа содержит классы, генерируемые с помощью CodeDOM во время выполнения, а также для того, чтобы отслеживать Я создал интерфейс, который называется IDataObject. Я пытаюсь передать конкретный тип каждого объекта общего метода выше следующим образом:

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

dataObject содержит экземпляр класса, который наследует от IDataObject. Я заинтересован в получении этого типа и передал его как T. Я пытаюсь выяснить, можно ли как-то использовать dynamic здесь. typeof() и GetType() не работают, как указано в Here

+1

Есть несколько трюков, которые используют динамику как мост между отражением и дженериками, но для этого требуется экземпляр. Если у вас нет экземпляра, MakeGenericMethod является вашим основным инструментом. Или не общий API ... –

+0

@MarcGravell: 'dataObject' - это экземпляр, который содержит информацию о типе, которую я пытаюсь извлечь и передать. Посмотрите на ответ Джона –

ответ

15

Я подозреваю, что вы хотите что-то вроде этого:

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

Это использует dataObject динамически, получая «выполнения время компилятора» для выполнения вывода типа для работы вне T ,

Вы can просто используйте отражение сделайте это самостоятельно, используя MethodInfo.MakeGenericMethod - но так как есть конечно нет код.

+0

Вот именно то, что я ищу Спасибо! –

+0

Вызов в первом методе должен быть 'return PurgeDataObjectImpl ((dynamic) dataObject, uid);' (неправильное имя метода, менее 6 символов, я не могу редактировать) –

+0

@MoslemBenDhaou: Doh, да действительно - исправлено, спасибо , –

Смежные вопросы