2013-05-10 112 views
7

我有使用泛型方法的API如下通具體的對象類型作爲參數泛型方法

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 ... – 2013-05-10 22:33:30

+0

@MarcGravell:'dataObject'是一個包含我試圖提取和傳遞的類型信息的實例。看看Jon的回答 – 2013-05-10 22:58:37

回答

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

可能只是使用反射來做到這一點,使用MethodInfo.MakeGenericMethod - 但這種方式肯定是更少的代碼。

+0

這正是我要找的感謝! – 2013-05-10 22:48:25

+0

在第一個方法中的調用應該是'返回PurgeDataObjectImpl((動態)dataObject,uid);'(錯誤的方法名稱,少於6個字符,我無法編輯) – 2013-05-10 23:02:55

+0

@MoslemBenDhaou:Doh,是的確 - 修正,謝謝。 – 2013-05-11 07:17:40