在C#中,有什麼辦法在編譯期間將一個泛型類型映射到另一個泛型類型?我想避免使用Reflection來解決這個問題。例如,假設我想有類型A地圖的TypeB,並具有類似下面的代碼工作的東西:沒有反射的編譯時通用類型映射
private void List<U> GetItemList<T>() where T : class <== U is the destination type obtained by the compile-time mapping from T to U
{
Type U = GetMappedType(typeof(T)) <=== this needs to happen during compile-time
List<U> returnList = Session.QueryOver<U>().List();
return returnList;
}
private Type GetMappedType(Type sourceType)
{
if (sourceType == typeof(TypeA))
return typeof(TypeB);
}
我知道,因爲我使用的方法調用映射類型,它在編譯期間不會執行映射,但是有沒有另一種方法可以完成我試圖實現的目標,僅在編譯期間?我知道上面的代碼是不正確的,但我希望你能看到我想要去做什麼。
總之,我想知道是否有辦法將一種類型映射到另一種類型,並讓C#編譯器知道類型映射,以便目標類型可以用作任何方法的泛型類型參數採用通用類型參數。我想避免使用反射。
作爲一個側面問題,如果我確實使用了Reflection,它會使實現非常耗費資源嗎?
你想用它達到什麼目的? – dmay
@dmay我正在爲我的應用程序構建一個存儲庫層,如下所示:[域層<==>存儲庫層(具有NHibernate類型)<==> DB]。我想要一個函數,它接受一個域類型和一個Func並輸出一個匹配該函數的域類型列表。問題是,使用NHibernate,我無法使用傳入的域類型進行查詢,我必須使用相應的存儲庫類型進行查詢。我有一個函數將我的域類型映射到NHibernate類型。所以我必須先將我的域類型轉換爲NHibernate類型,然後使用生成的NH類型來查詢NHibernate。 (contd ...) –
Anshul
(... contd)所以基本上我必須使用動態類型作爲泛型類型參數。我想我可能已經爲此找到了解決方案,那就是使用C#4.0中引入的「動態」關鍵字。它允許編譯器基本上繞過對象的類型安全性(據我所知),因爲您可以在任何需要動態確定對象類型的地方使用它。不過,我仍然在測試它,所以一旦我確定,我會在這裏發佈答案。 – Anshul