2013-07-29 54 views
1

在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,它會使實現非常耗費資源嗎?

+0

你想用它達到什麼目的? – dmay

+0

@dmay我正在爲我的應用程序構建一個存儲庫層,如下所示:[域層<==>存儲庫層(具有NHibernate類型)<==> DB]。我想要一個函數,它接受一個域類型和一個Func 並輸出一個匹配該函數的域類型列表。問題是,使用NHibernate,我無法使用傳入的域類型進行查詢,我必須使用相應的存儲庫類型進行查詢。我有一個函數將我的域類型映射到NHibernate類型。所以我必須先將我的域類型轉換爲NHibernate類型,然後使用生成的NH類型來查詢NHibernate。 (contd ...) – Anshul

+0

(... contd)所以基本上我必須使用動態類型作爲泛型類型參數。我想我可能已經爲此找到了解決方案,那就是使用C#4.0中引入的「動態」關鍵字。它允許編譯器基本上繞過對象的類型安全性(據我所知),因爲您可以在任何需要動態確定對象類型的地方使用它。不過,我仍然在測試它,所以一旦我確定,我會在這裏發佈答案。 – Anshul

回答

2

是的,動態就是答案。最近我遇到了同樣的問題,因爲我必須根據數據庫中配置的某些值切換存儲庫。

var tableNameWithoutSchema = tableName.Substring(tableName.IndexOf(".", StringComparison.Ordinal) + 1); 
var tableType = string.Format("Library.Namespace.{0}, Library.Name", tableNameWithoutSchema); 
var instance = UnitofWork.CreateRepository(tableType, uoW); 

CreateRepository返回一個動態類型需要

public static dynamic CreateRepository(string targetType, DbContext context) 
{ 
    Type genericType = typeof(Repository<>).MakeGenericType(Type.GetType(targetType)); 
    var instance = Activator.CreateInstance(genericType, new object[] { context }); 
    return instance; 
} 

背景下,我不得不通過構造函數傳遞上下文通用存儲庫。 在我的情況下,這種方法雖然有一些問題。 可能會幫助你。

+0

如果你不介意我問這個問題,你有什麼問題?因爲我認爲我正走向相同的道路.. – Anshul

+0

問題是我不得不使用lambda來過濾一些記錄,但你不能使用lambda與動態對象。 – Nilesh

+0

難道你不能只將動態類型轉換爲你的類型並使用lambda? – Anshul