2009-07-16 66 views
1

平臺:C#2.0的WinForms使用泛型當類型不被在編譯時已知

我有一個工廠類,提供取決於我發送它的類型特定的數據映射器的實例化,所述代碼是作爲這樣:

public static IDataMapper<T> GetMapper<T>() where T: IDto 
{ 
    Type mapperType = MapperLocator.GetMapper(typeof(T)); 

    return (IDataMapper<T>)mapperType.Assembly.CreateInstance(mapperType.FullName); 
} 

我正在使用DynamicProxy2截取對我的DTO對象的方法調用。在我的攔截方法中,我試圖使用Invocation.TargetType中的類型調用上述工廠。然而,除了這個例外:

無法找到類型或命名空間名稱'調用'。

顯然這是因爲任何對泛型方法的調用都需要根據我在編譯時理解的內容明確地知道類型。顯然,在這種情況下,我不能這樣做,我絕對不會在所有DTO對象中執行switch語句。

那麼,你們可以提出一個策略或指出我做錯了什麼嗎?我正在儘可能使其儘可能通用,以便它可以適用於我的所有對象和任何新對象,並且可以將代碼移植到其他項目。

在此先感謝!

+2

你爲什麼把這個帖子發佈爲社區wiki? – Brandon 2009-07-16 21:20:35

+0

是的,這應該是一個正常的問題。 – Noldorin 2009-07-16 21:21:17

回答

3

我對DTO並不熟悉,不知道這裏是否有足夠的信息來提供完整的解決方案。也就是說,another answer大多是正確的; C#編譯器在編譯時需要類型信息。

然而,有一種解決方法:反思。 System.Reflection(尤其是我認爲的MethodInfo)可以讓你編寫一個完全通用的解決方案。

如果我正確地理解了這個問題,你要做的是獲取該工廠函數的MethodInfo,用MakeGenericMethod替換類型,然後調用它。

0

不幸的是,沒有辦法解決這個問題, .NET C#編譯器需要在編譯時知道泛型類型;你必須找到另一種方法。

你也許可以使用裝箱/拆箱和非泛型,但我不太瞭解你將如何實現這一點。或者,您可以使用System.Reflection。再次,我不知道該怎麼做。

相關問題