2012-01-10 61 views
1

我有一個異步庫,它是在.NET 3.5下編譯的,因爲它被.NET 3.5應用程序使用,但我希望能夠處理.NET 4.0 CancellationTokens如果有人想要傳入。爲了包含.NET 4.0的東西,我必須打破與.NET 3.5的兼容性。我到目前爲止唯一的選擇是允許傳入「object」然後使用反射,但這會導致醜陋的公共接口...我想確保客戶端代碼傳遞的是正確的對象類型在編譯時,而不是運行時。支持較舊的框架版本中使用的庫中的新的.NET框架功能

有沒有什麼辦法可以在編譯時綁定.NET 4.0對象,而不會在消費者應用程序中引入不必要的依賴關係?如果說「如果有這個功能,請使用此功能,如果不是,請跳過它」?

+0

不需要,因爲您希望類型成爲公共接口的一部分,您必須編譯兩個不同的版本。 – adrianm 2012-01-10 21:38:50

+1

我可以建議您的圖書館的4.0版本和3.5版本可能更務實。 – 2012-01-10 21:39:58

+0

您可以使用#if!NET_3_5這樣的指令使用語句#endif來幫助減少代碼量。不知道這是否是一種好的做法。 – 2012-01-10 21:47:53

回答

1

您可以在單獨的程序集中使用需要.NET 4.0類型的公共接口,可能作爲擴展方法 - 如果需要(例如,.NET 4類型與主程序中類型的內部之間的交互)你可以在你的主(.NET 3.5)程序集中定義一個接口,並在.NET 4程序集中使用.NET 4類型的包裝來實現它,以避免完全反射。

+0

我喜歡這個,因爲它處理傳遞性問題:如果組件X需要組件Y需要組件Z,並且Z需要4.0,那麼這意味着X和Y需要4.0。但通過擴展方法,Z'可以包含4.0個東西,而Y可以保留3.5,並且X仍然可以通過包含Z'來使用4.0東西。主要缺點是您僅限於可以使用擴展方法實現的功能。這將使處理CancellationTokenRegistration變得有點混亂,但並非不可能。 – 2012-01-10 23:15:28

+0

因此,將CancellationTokenRegistration包裝在實現接口(在Y中定義)的類中(以Z爲單位)。 – Random832 2012-01-11 13:30:35